2012-04-11 14 views
5

Secondo MSDN:Declare ottenere di accesso a PowerShell parametri del cmdlet

"Parametri devono essere dichiarati su campi non statici pubblici o proprietà I parametri devono essere dichiarati sulle proprietà La proprietà deve avere un set pubblico.. accessor e se è specificata la parola chiave ValueFromPipeline o ValueFromPipelineByPropertyName, la proprietà deve disporre di un accesso pubblico di accesso. "

Perché devo dichiarare get accessors nei parametri del mio cmdlet ValueFromPipeline? Per quanto ne so, PowerShell deve solo inserire i loro valori, non leggerli. Grazie (comunque sono solo curioso di questo comportamento :)).

+0

Sembra strano. Posso solo supporre che si tratti di un artefatto di implementazione (ad esempio, leaky astrazione): seguire il codice quando si tratta di convalide e conversioni di tipo applicate alle proprietà dei parametri mostra che l'elaborazione non è semplice. D'altra parte ho raramente usato qualcosa di diverso da una proprietà automatica con set pubblico e non riesco a pensare a una circostanza in cui vorrei qualcos'altro. – Richard

risposta

3

PowerShell legge il valore di default dei parametri indicati con ValueFromPipeline o ValueFromPipelineByPropertyName di fare un backup prima di assegnare il nuovo valore ottenuto da the pipeline.

Si consideri il seguente cmdlet:

New-Post -Title <string> 
Set-Post -InputObject <Post> -Title <string> 

in cui si applica quanto segue:

  • il New-Post cmdlet ritorna l'appena creato Post oggetto nella pipeline, che ha un Title proprietà
  • il InputObject proprietà o n il cmdlet Set-Post è contrassegnato con ValueFromPipeline = true
  • la proprietà Title sul cmdlet Set-Post è contrassegnata con ValueFromPipelineByPropertyName = true.

la loro combinazione con il seguente comando:

New-Post -Title "Foo" | Set-Post 

e l'impostazione di un punto di interruzione nella accesso get di Title risultati di proprietà della Set-Post del cmdlet nel seguente stack trace:

Stack trace for parameter binding in PowerShell

Come puoi vedere, il metodo CmdletParameterBinderController.GetDefaultParameterValue viene richiamato durante il processo di associazione dello Title proprietà sul cmdlet Set-Post con il valore della proprietà corrispondente sull'oggetto proveniente dalla pipeline.

+0

+1 Per citare il principio del minimo stupore. –

+0

-1. Mentre c'è una logica in questo, non è come funziona PSH. All'interno del cmdlet si chiama 'WriteObject' per passare oggetti (o raccolte) al passaggio successivo della pipeline. – Richard

+0

@Richard Penso che tu abbia frainteso il mio punto.Non sto parlando di fermare l'intero oggetto da passare attraverso la pipeline, ma piuttosto * l'assegnazione automatica dei parametri * con lo stesso nome. PowerShell non sarebbe in grado di recuperare il valore assegnato ai parametri di un cmdlet se le proprietà corrispondenti erano * di sola scrittura *. –

Problemi correlati