高度な関数がややこしい
高度な関数で使えるパイプライン引数。
これすっげぇ変。なぜなら、パイプライン引数をパイプライン渡しした時とパラメータで渡した時とで$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
あー、なんかダメなパターンがある気がする。