Как мне обойти то, что PowerShell не привязывает параметры конвейера до тех пор, пока не будет вызван BeginProcessing?

StackOverflow https://stackoverflow.com/questions/1303282

  •  19-09-2019
  •  | 
  •  

Вопрос

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

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

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

A несколько вопросов вопрос, связанный с этим:

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

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


Обновить

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

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top