Como posso obter em torno PowerShell não vinculativo parâmetros de dutos até depois BeginProcessing é chamado?

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

  •  19-09-2019
  •  | 
  •  

Pergunta

Eu estou escrevendo um Cmdlet que pode ser chamado no meio de um gasoduto. Com este Cmdlet, existem parâmetros que têm o ValueFromPipelineByPropertyName atributo definido para que o cmdlet pode usar parâmetros com os mesmos nomes que são definidos no início do pipeline.

O paradoxo que eu correr em está na substituído BeginProcessing () método , eu utilizo um dos parâmetros que podem obter seu valor vinculado do pipeline. De acordo com a Cmdlet Processamento Lifecycle , a ligação de parâmetros de pipeline não ocorre até após BeginProcessing () é chamado. Portanto, parece que eu sou incapaz de contar com parâmetros ligados gasoduto se eles estão tentando ser usado em BeginProcessing () .

Já pensou em mover as coisas para o ProcessRecord () método . Infelizmente, existe uma só vez, operação relativamente cara que precisa ocorrer. O melhor lugar para isso acontecer parece estar na BeginProcessing () método para ajudar a garantir que só acontece uma vez na calha.

A algumas perguntas questão em torno este:

  1. Existe um boa maneira de contornar isso?
  2. Estes mesmos parâmetros também têm a conjunto de atributos obrigatória sobre eles. Como posso até mesmo chegar tão longe sem PowerShell reclamando sobre não ter esses parâmetros necessários?

Agradecemos antecipadamente por seus pensamentos.


Atualização

Eu tirei a segunda parte da pergunta, como eu percebi que eu simplesmente não entendia parâmetros vinculados dutos bem o suficiente. I mistakingly pensou que os parâmetros vinculados gasoduto veio do anterior Cmdlet que executou no pipeline. O realmente vêm do objeto que está sendo passado através do gasoduto! I referência a um mensagem por Keith Hill para ajudar a entender isso.

Foi útil?

Solução

Você pode definir um bool campo de instância (Init) para falso no BeginProcessing. Em seguida, verifique se o parâmetro é definido em BeginProcessing. Se for, em seguida, chamar um método que faz a inicialização uma vez (InitMe). Em ProcessRecord verificar o valor de inicialização e se for falsa, em seguida, chamar InitMe. InitMe deve definir Init para true antes de retornar.

Quanto à sua segunda pergunta, se você marcou o parâmetro como obrigatório, então ele deve ser fornecido como um parâmetro ou através do oleoduto. Você está usando vários conjuntos de parâmetros? Se assim for, então mesmo se um parâmetro estiver marcado como obrigatório, só é obrigatória se o conjunto de parâmetro associado é o que é determinado pela PowerShell para estar em uso para uma invocação particular do cmdlet.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top