もぐてっく

人は1つ歳をとるたび、1ビットづつ大きくなれると信じてた。

高度な関数がややこしい

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

あー、なんかダメなパターンがある気がする。