2012-04-11 9 views
5

Nach MSDN:Declare erhalten Accessoren in Powershell-Cmdlets Parameter

„Parameter müssen auf die öffentliche nicht-statische Felder oder Eigenschaften deklariert werden Parameter sollten auf Eigenschaften deklariert werden Die Eigenschaft muss eine öffentliche gesetzt haben.. Accessor, und wenn das ValueFromPipeline oder ValueFromPipelineByPropertyName Schlüsselwort angegeben ist, muss die Eigenschaft einen öffentlichen Get Accessor haben. "

Warum muss ich Zugriffsmethoden in meinem Cmdlet ValueFromPipeline Parameter deklarieren? Soweit ich weiß, muss PowerShell nur ihre Werte eingeben und nicht auslesen. Danke (übrigens bin ich nur neugierig auf dieses Verhalten :)).

+0

Es scheint eine seltsame Anforderung. Ich kann nur davon ausgehen, dass es sich um ein Implementierungsartefakt (dh undichte Abstraktion) handelt: Durch die Verarbeitung von Validierungen und Typumwandlungen, die auf Parametereigenschaften angewendet werden, ist die Verarbeitung von Code nicht einfach. Auf der anderen Seite habe ich selten etwas anderes als eine automatische Eigenschaft mit öffentlichem Set und Get verwendet und kann mir keinen Umstand vorstellen, bei dem ich etwas anderes wollen würde. – Richard

Antwort

3

Powershell liest den Standardwert des Parameters markiert mit ValueFromPipeline oder ValueFromPipelineByPropertyName um eine Sicherungskopie zu machen vor Zuweisen des neuen Wert von the pipeline erhalten.

Betrachten Sie die folgenden Cmdlets:

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

wobei folgendes gilt:

  • das New-Post Cmdlets gibt die neu geschaffene Post Objekt in die Pipeline, die eine Title Eigenschaft hat
  • die InputObject Eigenschaft o n Das Cmdlet Set-Post ist mit ValueFromPipeline = true
  • markiert. Die Title-Eigenschaft auf dem Cmdlet Set-Post ist mit ValueFromPipelineByPropertyName = true gekennzeichnet.

die Kombination mit dem folgenden Befehl:

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

und einen Haltepunkt an der get-Accessor der Set-Post Cmdlets der Title Eigenschaft ergibt folgende Stack-Trace Einstellung:

Stack trace for parameter binding in PowerShell

Wie Sie sehen können, wird die CmdletParameterBinderController.GetDefaultParameterValue Methode während des Prozesses der Bindung deraufgerufenEigenschaft auf dem Cmdlet Set-Post mit dem Wert aus der entsprechenden Eigenschaft des Objekts, das aus der Pipeline stammt.

+0

+1 Für das Prinzip des geringsten Erstaunens. –

+0

-1. Obwohl es eine Logik dazu gibt, funktioniert PSH nicht so. Innerhalb des Cmdlets rufen Sie 'WriteObject' auf, um Objekte (oder Sammlungen) an den nächsten Schritt der Pipeline zu übergeben. – Richard

+0

@Richard Ich glaube, du hast meinen Standpunkt missverstanden.Ich spreche nicht davon, das gesamte Objekt daran zu hindern, durch die Pipeline zu gehen, sondern die * automatische Zuweisung von Parametern * mit dem gleichen Namen. PowerShell kann den Wert, der den Parametern eines Cmdlets zugewiesen ist, nicht abrufen, wenn die entsprechenden Eigenschaften * schreibgeschützt * waren. –

Verwandte Themen