PowerShellパイプの振る舞い

PoweShell コンピュータ
PowerShell
スポンサーリンク

スクリプト


# 
# パイプのテスト
# 

function TestFunc
{
    param (
        [parameter(ValueFromPipeline=$true)]
        $val
    )
    begin
    {
        "TestFunc:Begin"
    }
    process 
    {
        "TestFunc(val:${val})"
    }
    end
    {
        "TestFunc:End"
    }
}

function TestFunc2
{
    param (
        [parameter(ValueFromPipeline=$true)]
        $val
    )
    begin
    {
        "TestFunc2:Begin"
    }
    process 
    {
        "TestFunc2(val:${val})"
    }
    end
    {
        "TestFunc2:End"
    }
}

function TestFunc3
{
    param (
        [parameter(ValueFromPipeline=$true)]
        $val
    )
    begin
    {
        "TestFunc3:Begin"
    }
    process 
    {
        "TestFunc3(val:${val})"
    }
    end
    {
        "TestFunc3:End"
    }
}

@(1..5) | TestFunc | TestFunc2 | TestFunc3

結果

TestFunc3:Begin
TestFunc3(val:TestFunc2:Begin)
TestFunc3(val:TestFunc2(val:TestFunc:Begin))
TestFunc3(val:TestFunc2(val:TestFunc(val:1)))
TestFunc3(val:TestFunc2(val:TestFunc(val:2)))
TestFunc3(val:TestFunc2(val:TestFunc(val:3)))
TestFunc3(val:TestFunc2(val:TestFunc(val:4)))
TestFunc3(val:TestFunc2(val:TestFunc(val:5)))
TestFunc3(val:TestFunc2(val:TestFunc:End))
TestFunc3(val:TestFunc2:End)
TestFunc3:End

学んだこと

関数へ配列を渡して一気に処理されるのではなく各要素を一つづつ処理される。
今回の例の場合、配列の最初の要素1→TestFunc→TestFunc2→TestFunc3→配列の2番目の要素2→TestFunc→TestFunc2→TestFunc3…と処理される。
beginやendの振る舞いをみると関数内で出力した内容が次の関数へ引き渡されている。引き渡された要素を関数内で意図的に出力をしないことで絞り込みをすることや、逆に出力を増やすことで要素を増やすことが出来ると思われる。

コメント