2017-06-16 2 views
-1

Ich schreibe ein PowerShell-Skript, das 2 Parameter - Computername oder Seriennummer - und einige Informationen über den entsprechenden Computer ausgeben kann. Wenn ich jedoch einen Wert aus der Pipeline übergebe, geht es immer in den falschen Parameter.PowerShell-Pipeline-Eingabe wird zum falschen Parameter

Hier ist mein Code:

Param 
(
    [Parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$True)] 
    [String]$ComputerName, 
    [Parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$True)] 
    [String]$SerialNumber 
) 

Dann verwendet sie diese Werte Informationen aus SCCM zu ziehen.

Wenn ich jedoch die folgende Zeile verwenden das Skript aufrufen:

"<ComputerName>" | .\Get-SerialNumber.ps1 -ComputerName $_ 

Der Computername wird der Serial Parameter setzen in anstelle des Computername-Parameter.

Wenn ich in

setzen
"<SerialNumber>" | .\Get-SerialNumber.ps1 -SerialNumber $_ 

Der Wert wird in den Computername-Parameter übergeben. Was geht hier vor sich? Warum werden sie zurückgereicht?

Wenn ich in

Typ
.\Get-SerialNumber.ps1 -SerialNumber "<SerialNumber>" 

oder

.\Get-SerialNumber.ps1 -ComptuerName "<ComputerName>" 

es funktioniert gut. Es verschraubt nur, wenn Werte durch die Pipeline geleitet werden.

Zur Erinnerung, ich habe versucht, meine PowerShell-Sitzung neu zu starten, um sicherzustellen, dass in meiner Sitzung nicht etwas Seltsames passiert und ich sogar auf einem anderen Computer versucht habe. Es passiert immer noch auf die gleiche Weise.

+0

@briantist Dies ist KEIN Duplikat der Frage, die verlinkt wurde. Ich habe mir nur diese Frage/Antwort angesehen, meine Frage wurde nicht als Teil davon beantwortet. Diese Frage zeigt auf einer sehr grundlegenden Ebene, was die Pipeline tut, dies war ein fortgeschrittenes Niveau der Pipeline-Nutzung. – Randy

+0

Ich stimme nicht zu; Ihre Frage zeigte ein Missverständnis der grundlegenden Pipelineverwendung, die das verknüpfte Duplikat bietet. Sie haben versucht, etwas Ungültiges zu tun, keine fortgeschrittene Verwendung. – briantist

+0

@briantist ja, es war ein Missverständnis, das ist ein großer Teil dessen, wofür diese Seite ist. Mein Missverständnis ist jedoch in keiner Weise in dem angegebenen Link beschrieben. Nach dem Lesen dieser Frage und ihrer Antworten hätte ich nicht mehr verstanden, was ich zu tun versuchte. Die Kommentare auf der Antwort unten DID, auf der anderen Seite, helfen mit meinem Verständnis dieses spezifischen Konzepts und gaben mir eine tatsächliche Antwort auf meine Frage. – Randy

Antwort

1

Die Art, wie Sie diese aufrufen, ergibt keinen Sinn. Wenn Sie einen Computernamen über die Pipeline übergeben und dann auch -ComputerName als benannten Parameter angeben, bindet er die Pipeline natürlich an den einzigen anderen Parameter, der Pipeline-Eingaben akzeptiert. Wie haben Sie zwei verschiedene Werte für denselben Parameter angenommen? Wie würdest du es benutzen?

+0

Sollte nicht '$ _' den Wert darstellen, der durch die Pipeline geleitet wird? würde nicht '-ComputerName $ _' bedeuten, den Wert aus der Pipeline dem Parameter ComputerName zuzuordnen? – Randy

+0

@Randy Nein, überhaupt nicht. Sie müssen einen 'Process {}' -Block in Ihrer Funktion verwenden und innerhalb dieses Prozessblocks würde sich '$ ComputerName' auf das aktuelle Pipeline-Objekt beziehen. Der 'Process'-Block wird einmal für jedes Element in der Pipeline aufgerufen. – briantist

+2

* Sollte nicht '$ _' den Wert repräsentieren, der durch die Pipeline geleitet wird? * Ja, es repräsentiert den Wert von * outer * pipeline:' "Outer pipeline" | % {"" | . \ Get-SerialNumber.ps1 -ComputerName $ _} '. Du kannst es aber so schreiben: '" "| . \ Get-SerialNumber.ps1 -ComputerName {$ _} ', verhindert jedoch nicht das Binden von Pipeline-Werten an andere' ValueFromPipeline'-Parameter. – PetSerAl

Verwandte Themen