2017-02-24 6 views
1

Ich verwende Powershell 5, wenn diese relevant istPowershell: Pipeline-Objekte in Pipeline-Objekte

Wenn eine Eigenschaft auf das aktuelle Element in einer Pipeline ergänzt:

Ich kann nicht auf beziehen $ _bis habe ich es in eine andere Pipeline gefüttert. Warum?

# make some objects to pass around 
$test = (0..3) | %{[pscustomobject]@{key1="v$_.1";key2="v$_.2"} } 
# GM = TypeName: System.Management.Automation.PSCustomObject 
# trying to use the current pipeline object 
$test | Add-Member @{key3=$_.key1} 
$test | ft * 

key1 key2 key3 
---- ---- ---- 
v0.1 v0.2  
v1.1 v1.2  
v2.1 v2.2  
v3.1 v3.2  

# try again, this time taking the current pipeline object... 
#... and then putting it into another identical looking pipeline 
$test | %{ $_ | Add-Member @{key4=$_.key1} } 
$test | ft * 

key1 key2 key3 key4 
---- ---- ---- ---- 
v0.1 v0.2  v0.1 
v1.1 v1.2  v1.1 
v2.1 v2.2  v2.1 
v3.1 v3.2  v3.1 

Ich vermute, es könnte sein, dass die erste automatisch etwas was impliziert, und ich habe nicht die unsichtbare/implizierte Funktion weitergeben $ PSItem erzählt.

+0

Alle Argumente, die vor dem Start der Pipeline ausgewertet wurden. '[pscustobject] @ {key1 = 'etwas anderes'} | % {$ test | Add-Mitglied @ {key3 = $ _. Key1}} '. – PetSerAl

Antwort

3

Alle Argumente werden im aktuellenscope ausgewertet, bevor der Befehl gestartet wird, unabhängig davon, ob er syntaktisch in einer Pipeline verwendet wird. So $test | Add-Member @{key3=$_.key1} verwendet $_ aus dem aktuellen Bereich, was bedeutet, dass es kein Element in $test ist.

$_ für jedes Element in der Pipeline ausgewertet zu haben, sollte ein neuer Rahmen für jedes Element über Script (der Code in geschweiften Klammern) in ForEach, Where wie 1..2 | ForEach { $_ } oder in Script Parametern wie E xpression in select @{N='calculated property'; E={$_.foo}} erstellt werden.

+1

Was Sie _context_ aufrufen, wird normalerweise _scope_ genannt. Skriptblöcke öffnen einen neuen Bereich, in dem Variablen definiert werden können, die im äußeren Bereich nicht vorhanden sind. – Joey

+0

In der Tat, danke, ich habe die Antwort bearbeitet. – wOxxOm