PowerShell が BeginProcessing が呼び出されるまでパイプライン パラメーターをバインドしないのを回避するにはどうすればよいですか?
-
19-09-2019 - |
質問
パイプラインの途中で呼び出すことができるコマンドレットを作成しています。このコマンドレットには、次のパラメータがあります。 ValueFromPipelineByPropertyName 属性は、コマンドレットがパイプラインで以前に定義されているのと同じ名前のパラメーターを使用できるように定義されます。
私が遭遇したパラドックスは上書きされたものにあります BeginProcessing() メソッドでは、パイプラインからバインドされた値を取得できるパラメーターの 1 つを利用します。による コマンドレット処理ライフサイクル, 、パイプライン パラメーターのバインドは、次の時点まで行われません。 後 BeginProcessing() と呼ばれます。したがって、パイプラインにバインドされたパラメーターを使用しようとしている場合、それらに依存することはできないようです。 BeginProcessing().
に物事を移動することを考えました プロセスレコード() 方法。残念ながら、比較的高価な操作を 1 回だけ実行する必要があります。これが起こるのに最適な場所は、 BeginProcessing() このメソッドを使用すると、パイプライン内で 1 回だけ発生するようになります。
あ いくつかの質問 これに関する質問:
- ありますか 良い これを回避する方法は?
これらの同じパラメータにも、 必須 それらに設定された属性。これらの必須パラメーターがないという PowerShell のエラーを出さずに、どうすればここまで到達できるでしょうか?
ご意見ありがとうございます。
アップデート
パイプライン バインド パラメーターについて十分に理解していないことに気づいたので、質問の 2 番目の部分を削除しました。パイプライン バインド パラメーターが 前の コマンドレット パイプラインで実行されたもの。実際に由来するのは、 物体 パイプラインを通過中です!私が参考にしたのは、 キース・ヒルによる投稿 これを理解するのに役立ちます。
解決
あなたはBeginProcessingにfalseにインスタンスフィールドブール値(初期化)を設定することができます。そして、パラメータがBeginProcessingに設定されているかどうかを確認します。それがある場合は、1時間のinit(InitMe)を行いメソッドを呼び出します。 ProcessRecordでは初期の値をチェックし、それが偽である場合は、InitMeを呼び出します。 InitMeは返す前にtrueに初期化を設定する必要があります。
あなたはそれがパラメータとしてまたはパイプラインを経由してのいずれか供給されなければならないとして、必須パラメータをマークした場合、あなたの2つ目の質問、について。あなたは、複数のパラメータセットを使用していますか?その場合、パラメータが必須としてマークされている場合でも、関連するパラメータセットは、コマンドレットの特定の呼び出しのために使用中であるとのPowerShellによって決定されるものであれば、次に、それだけに必須である。