2017-06-14 7 views
0

PSはパイプラインを通過するときにアレイを展開します。 $a配列が正しく展開する。この場合、パイプラインを通してアレイを正しく展開するには?

$a = @("a", "b", "c") 
$a | Write-Host 


は、私は次のテストスクリプトを使用して、それをテストしたい

a 
b 
c 

をしかし、私は自分自身の関数を使用するとき

Function Do-Something([Parameter(ValueFromPipeline)] $str) { 
    Write-Host $str 
} 

$a | Do-Something 

出力は次のとおりです。

c 

カスタム関数でパイプラインを通じて配列要素を正しく処理する方法はありますか?

+1

[パイプライン入力を受け付けるPowerShellスクリプトを書くにはどうすればいいですか?](// stackoverflow.com/a/885627) – wOxxOm

+0

ここでは、[Boe Proxのブログ記事](https://learn-powershell.net/2013/05/07/tips-on-implemented-pipeline-support /)を参照してください。 – BenH

答えて

3

出力はありません、あなたの関数の定義は、 "間違った" である

間違っています。それの体内の3つのブロックあり、

Function Do-Something([Parameter(ValueFromPipeline)] $str) { 
    process { Write-Host $str } 
} 

高度なPowerShellの機能(パイプライン入力を受け取り1)::beginprocessendを、そして次のようになります。

Function Do-Something { 
    param([Parameter(ValueFromPipeline)] $str) 

    begin {} 
    process {} 
    end {} 
} 
に変更します

beginブロックとendブロックはそれぞれとなります(それぞれ)(先頭と末尾にそれぞれ)、processブロックは入力値の間に一度だけの間でパイプラインからバインドされます。

あなたがbeginprocessend宣言を省略すると、関数の本体全体がendブロックとして解釈されますので、あなたのサンプル関数を効果的にのように解釈されます。

あなたが見る理由です
Function Do-Something { 
    param([Parameter(ValueFromPipeline)] $str) 

    end { 
     Write-Host $str 
    } 
} 

Write-Hostコマンドレットは、最後の入力値に対して1回だけ呼び出されます。

+0

関数の定義が間違っていると、出力が正しくありません。私は矛盾は見ません。 – enkryptor

+0

@enkryptorいいえ、出力は言語仕様と完全に一致しています.-P –

0

また

,$a | Do-Something 

この場合の処理​​ブロックを使用する必要を試すことができませんでした。

+1

私の知る限り、それは配列を展開しません。代わりに配列の配列を渡します。最初の配列は展開され、2番目の配列は関数に渡されます。 – enkryptor

+0

私は完全に間違ったトラックにいるかもしれませんが、このようなものがあなたが望む結果をもたらすはずです: 'function f1([Parameter(ValueFromPipeline = $ true)] [Object] $ v) – PeterXX

+0

それを保存するのが遅すぎた)。私は完全に間違ったトラックにいる可能性がありますが、これは配列の配列についてではありません。 PowerShellのヘルプでは、コンマは、配列変数が配列自体のすべての要素を渡す前に、1つのメンバーがコンマを入れて配列を作成すると記載されています。それを試しましたか? – PeterXX

関連する問題