高度な関数がややこしい
高度な関数で使えるパイプライン引数。
これすっげぇ変。なぜなら、パイプライン引数をパイプライン渡しした時とパラメータで渡した時とで$Testの中身が違うんスよ。
function Proc {
[CmdletBinding()]
Param(
[Parameter(Mandatory=$true,Position=0,ValueFromPipeline=$true)]$Test
)
Begin {
$i = 0
}
Process {
"Proc[" + $i.ToString() + "]:" + $Test
$i++
}
}
"a" | Proc
Proc "b"
("c","d") | Proc
Proc ("e","f")
----------------------------------------------------
Proc[0]:a
Proc[0]:b
Proc[0]:c
Proc[1]:d
Proc[0]:e fつまり、こういう事みたい。
- パイプライン渡し:配列の要素分Processが実行される。$Testはそんときの配列の要素が入る。
丁度以下のコードと等価。
foreach($inp in $input) {
&Process $inp
}
- 引数渡し:Process実行は1回だけ。$Testには配列がそのまま。
&Process $input
ううむ、両方で共通のコードが書けないとこの書き方のメリットがないぞ。
取り敢えず今の暫定回答はProcessのなかでforeachすればいいんじゃないかと。
function Proc {
[CmdletBinding()]
Param(
[Parameter(Mandatory=$true,Position=0,ValueFromPipeline=$true)]$Test
)
Begin {
$i = 0
}
Process {
foreach($in in $Test)
{
"Proc[" + $i.ToString() + "]:" + $in
}
$i++
}
}
"a" | Proc
Proc "b"
("c","d") | Proc
Proc ("e","f")
----------------------------------------------------
Proc[0]:a
Proc[0]:b
Proc[0]:c
Proc[1]:d
Proc[0]:e
Proc[0]:fあー、なんかダメなパターンがある気がする。