1

パイプラインの途中で呼び出すことができるコマンドレットを作成しています。このコマンドレットには、ValueFromPipelineByPropertyName属性が定義されたパラメーターがあり、コマンドレットは以前にパイプラインで定義された同じ名前のパラメーターを使用できます。

私が遭遇したパラドックスは、オーバーライドされたBeginProcessing()メソッドにあります。パイプラインからバインドされた値を取得できるパラメーターの 1 つを利用します。Cmdlet Processing Lifecycleによると、パイプライン パラメーターのバインディングは BeginProcessing()が呼び出されるまで発生しません。したがって、 BeginProcessing()で使用しようとしている場合、パイプラインにバインドされたパラメーターに依存できないようです。

ProcessRecord()メソッドに移行することを考えました。残念ながら、発生する必要がある 1 回限りの比較的高価な操作があります。これが発生するのに最適な場所は、パイプラインで一度だけ発生することを保証するために、 BeginProcessing()メソッドにあるようです。

これに関するいくつかの質問:

  1. これを回避する良い方法 はありますか?
  2. これらの同じパラメーターには、必須属性も設定されています。これらの必須パラメーターがないことについて PowerShell が不平を言うことなく、どうすればここまで到達できるでしょうか?

ご意見ありがとうございます。


アップデート

パイプラインにバインドされたパラメーターを十分に理解していないことに気付いたので、質問の2番目の部分を取り出しました。パイプラインにバインドされたパラメーターは、パイプラインで実行された以前の コマンドレットからのものであると誤って考えました。実際には、パイプラインを通過するオブジェクトから取得されます! これを理解するために、Keith Hillの投稿を参照しました。

4

1 に答える 1

2

BeginProcessingでインスタンスフィールドbool(Init)をfalseに設定できます。次に、パラメータがBeginProcessingで設定されているかどうかを確認します。その後、1回限りのinit(InitMe)を実行するメソッドを呼び出します。ProcessRecordで、Initの値を確認し、それがfalseの場合は、InitMeを呼び出します。InitMeは、戻る前にInitをtrueに設定する必要があります。

2番目の質問に関して、パラメーターを必須としてマークした場合は、パラメーターとして、またはパイプラインを介して提供する必要があります。複数のパラメータセットを使用していますか?その場合、パラメーターが必須としてマークされている場合でも、関連付けられたパラメーターセットが、コマンドレットの特定の呼び出しに使用されているとPowerShellによって決定されたものである場合にのみ必須です。

于 2009-08-20T02:07:59.813 に答える