2017-01-19 4 views
3

次のコマンドを使用してパイプラインを実行します。パイプラインのセマンティクスがWhere-Objectに伝播されない

.\Find-CalRatioSamples.ps1 data16 ` 
    | ? {-Not (Test-GRIDDataset -JobName DiVertAnalysis -JobVersion 13 -JobSourceDatasetName $_ -Exists -Location UWTeV-linux)} 

第1のスクリプトは私のカスタムスクリプトで、非常に高速です(ミリ秒)。 2番目のコマンドは私が書いたカスタムコマンドです(https://github.com/LHCAtlas/AtlasSSH/blob/master/PSAtlasDatasetCommands/TestGRIDDataset.cs参照)。それは非常に遅いです。

実際、入力の各行を処理する速度がそれほど遅くはありません。入力の最初の行が処理される前の設定は非常に高価です。しかし、それは非常に迅速に行われます。したがって、すべての高価なコードは一度実行され、新しいパイプライン入力ごとにかなり高速のコードのみを実行する必要があります。

残念ながら、私はしたいときは? {}上記のように、PowerShellは前と同じようにパイプラインを保持しないようです。これは今、私にコマンドを入力の各行に新鮮な時間と呼んで、コマンドが各行のすべての設定をやり直させるようにします。

パイプラインの呼び出し方法を変更することはできますか?または、これを防ぐために私のコマンドレットをどのようにコード化したのでしょうか?または、これは単なるWhere-Objectの仕組みなので、私は立ち往生していますか?

答えて

5

これは設計通りに動作しています。コマンドを呼び出すと、スクリプトブロック内に新しい(ネストされた)パイプラインが開始されます。

Beginブロックで機能が高価なコードを実行している場合は、に直接パイプを使用してその機能を活用する必要があります。

.\Find-CalRatioSamples.ps1 data16 | 
    Test-GRIDDataset -JobName DiVertAnalysis -JobVersion 13 -Exists -Location UWTeV-linux | 
    Where-Object { $_ } 

しかし、あなたが望むオブジェクト(元のもの)を返さないようです。

Test-GRIDDatasetを変更できる可能性がある方法は、元のスクリプトの完全なオブジェクトを実際に受け入れていないのに、-PassThruスイッチを実装することです。これが実現可能かどうかはわかりません。あなたが書いたコードは、その名前に基づいてどこかから物事(?)を取得しているようです。おそらくそれで十分でしょうか? -PassThruが指定されている場合、(存在するかどうかのブール値ではなく)パイプラインを通じてオブジェクトを送信します。

次に、あなたのコードは次のようになります。私は前にPashThruパラメータのことを聞いたことはないと思います

.\Find-CalRatioSamples.ps1 data16 | 
    Test-GRIDDataset -JobName DiVertAnalysis -JobVersion 13 -Exists -Location UWTeV-linux -PassThru 
+0

は - 福袋のビットのように思えるが、よさそうです。ここでは後でこの質問に来る人のための古いブログ投稿があります:https://blogs.technet.microsoft.com/heyscriptingguy/2011/11/18/use-the-powershell-passthru-parameter-and-get -back-objects / – Gordon

関連する問題