Как мне обойти PowerShell, не связывая параметры конвейера, пока не будет вызвана BeginProcessing? - PullRequest
1 голос
/ 20 августа 2009

Я пишу командлет, который можно вызвать в середине конвейера. В этом командлете есть параметры с атрибутом ValueFromPipelineByPropertyName , чтобы командлет мог использовать параметры с такими же именами, которые были определены ранее в конвейере.

Парадокс, с которым я столкнулся, заключается в переопределенном методе BeginProcessing () , я использую один из параметров, который может связать его значение с конвейером. Согласно жизненному циклу обработки командлетов 1008 * привязка параметров конвейера не происходит до тех пор, пока после вызова BeginProcessing () . Поэтому кажется, что я не могу полагаться на параметры, связанные с конвейером, если они пытаются использовать в BeginProcessing () .

Я думал о переносе вещей в метод ProcessRecord () . К сожалению, необходимо выполнить относительно дорогостоящую операцию. Лучшее место для этого, по-видимому, - метод BeginProcessing () , чтобы гарантировать, что это происходит только один раз в конвейере.

A несколько вопросов вопрос, окружающий это:

  1. Есть ли хороший способ обойти это?
  2. Этим же параметрам также установлен атрибут Обязательный . Как я могу получить это далеко без PowerShell, жалуясь на отсутствие этих обязательных параметров?

Заранее спасибо за ваши мысли.


Обновление

Я снял вторую часть вопроса, так как понял, что недостаточно хорошо понимаю параметры привязки к трубопроводу. Я ошибочно подумал, что параметры привязки к конвейеру взяты из предыдущего командлета , который выполнялся в конвейере. Фактически происходит от объекта , проходящего через конвейер! Я сослался на сообщение Кейта Хилла , чтобы помочь понять это.

1 Ответ

2 голосов
/ 20 августа 2009

Вы можете установить для поля экземпляра bool (Init) значение false в BeginProcessing. Затем проверьте, установлен ли параметр в BeginProcessing. Если это так, тогда вызовите метод, который выполняет однократную инициализацию (InitMe). В ProcessRecord проверьте значение Init и, если оно ложно, вызовите InitMe. InitMe должен установить Init в true перед возвратом.

Что касается вашего второго вопроса, если вы пометили параметр как обязательный, тогда он должен быть предоставлен либо как параметр, либо через конвейер. Вы используете несколько наборов параметров? Если это так, то даже если параметр помечен как обязательный, он является обязательным только в том случае, если связанный набор параметров является тем, который определяется PowerShell для использования при конкретном вызове командлета.

...