where-object
フィルタスクリプトのスクリプトブロックに親スコープ変数を使用するよりも情報を渡す方が良いでしょうか?PowershellでWhere-Objectでパラメータ化されたスクリプトブロックを使用するにはどうすればよいですか?
背景:
私はソースコントロール対未チェックインされたおよび/または変更されたソースファイルを探し、それをより徹底的な検索を行うことができますパラメータを持つスクリプトを持っています。私はwhere-object
を、スクリプトの入力パラメータに基づいてカスタマイズするスクリプトスコープの変数に含まれるスクリプトブロックオブジェクトを使用して数か所で使用します。
徹底的な検索を要求すると、フィルタは候補ファイルとすべてのTFSファイルを比較して、ファイルがソース管理に含まれていないかどうかを調べます。チェックアウトされたファイルと比較して、ファイルが変更されているがチェックアウトされていないかどうかを確認します。
カスタマイズされたスクリプトブロックは、ソース管理に対してクエリを実行した結果を含むスクリプトスコープの変数を参照します。
私の問題は、グローバルな(スクリプトレベルの)変数を取り除き、必要なすべての情報をスクリプトブロックのパラメータとしてスクリプトブロックに渡すことです。 invoke-command
を使用していた場合、これを行うにはArgumentList
パラメータを使用します。 Where-Object
はそれを持っていないようです。スクリプトブロックで親スコープの変数参照を使用することの1つの欠点は、これらの変数を変更できないため、遅延初期化を行うことができないことです(または、少なくとも私は方法をまだ理解していません。 。PowerShellのルールをスコープ)
Heheh、ええ、ちょうど私が昼食に私に起こった。また、FilterProcsメソッドが渡されたスクリプトブロックへのフィードを取得する '-ArgumentList'パラメータを取ると考えていました。 –
$ argsがキャプチャを免除されているか、スクリプトブロックの新しいスコープを作成していますか?そのスコープのargsは、親スコープからの$ argsをもはや見ることができません?私は、select-objectを使ってハッシュテーブル式と同様の動作をしました。 $ argsがハッシュテーブル式スクリプトブロックで使用されていた場合、$ script:argsとして明示的にスコープされていなければなりません。ローカルの$ argsはnullです。 – mjolinor
"捕まえられている可能性が高いが、踏みつぶされている可能性が高い。"だからええ。 – x0n