Ich habe in PowerShell viel Folgendes gesehen, aber was macht es genau?
$_
Ich habe in PowerShell viel Folgendes gesehen, aber was macht es genau?
$_
Antworten:
Dies ist die Variable für den aktuellen Wert in der Rohrleitung, die $PSItem
in Powershell 3 und höher aufgerufen wird .
1,2,3 | %{ write-host $_ }
oder
1,2,3 | %{ write-host $PSItem }
Im obigen Code wird der %{}
Block beispielsweise für jeden Wert im Array aufgerufen. Die Variable $_
oder $PSItem
enthält den aktuellen Wert.
ForEach-Object
oder Where-Object
Sie können es nicht in so etwas wie verwenden Get-Foo|Add-Member NoteProperty Bar ($_.SomeProperty)
- es ist eine Pipeline beteiligt, aber kein Skriptblock und daher nein $_
. (Davon abgesehen bezieht sich die PowerShell-Hilfe auch auf die Pipeline für $_
. Verwirrend.)
Get-Foo | Add-Member -Type NoteProperty -Name Bar -Value $_.SomeProperty
Get-ChildItem | Add-Member -Type NoteProperty -Name Bar -Value $_.Name -PassThru | Select Bar
... Nun, es kann funktionieren, wenn Sie eine $_
in dem Bereich haben, in dem Sie diese Pipeline ausführen. Aber das unterscheidet sich sehr von dem, was Sie normalerweise meinen, wenn Sie versuchen, so etwas zu schreiben.
$_
in dem, was Sie geschrieben haben, durchläuft aus irgendeinem Grund nicht alle Objekte. Versuchen Sie dies stattdessen. gci | % { $_ | add-member -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
. Ich vermute, dass gci | cmdlet
ohne das explizite foreach gci-Ergebnisse gesammelt und ein Array an das Cmdlet übergeben werden. Da das Array jedoch ein Objekt ist, wird dem Array-Objekt eine Eigenschaft hinzugefügt. Das Array hat keine 'name'-Eigenschaft, daher ist der Wert, der $ _. Bar zugewiesen wird, $ null. Fazit ist, dass $ _ häufig mit Pipelining verwendet wird. Es ist neu,% {} nicht zum Durchlaufen zu benötigen.
gci | % { add-member -InputObject $_ -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
Ich denke, der einfachste Weg, über diese Variable wie den Eingabeparameter im Lambda-Ausdruck in C # nachzudenken. Dh $_
ist ähnlich wie x
inx => Console.WriteLine(x)
anonymer Funktion in C #. Betrachten Sie folgende Beispiele:
Power Shell:
1,2,3 | ForEach-Object {Write-Host $_}
Drucke:
1
2
3
oder
1,2,3 | Where-Object {$_ -gt 1}
Drucke:
2
3
Und vergleichen Sie dies mit der C # -Syntax unter Verwendung von LINQ:
var list = new List<int> { 1, 2, 3 };
list.ForEach( _ => Console.WriteLine( _ ));
Drucke:
1
2
3
oder
list.Where( _ => _ > 1)
.ToList()
.ForEach(s => Console.WriteLine(s));
Drucke:
2
3
_
als Eingabeparameter in Lambda verwenden. _
wird manchmal verwendet, wenn die Parameter ignoriert werden. Verwenden Sie stattdessen x. stackoverflow.com/questions/424775/…
Laut dieser Website handelt es sich um einen Verweis this
, meist in Schleifen.
$ _ (Dollar-Unterstrich) 'DIESES' Token. Bezieht sich normalerweise auf das Element innerhalb einer foreach-Schleife. Aufgabe: Drucken Sie alle Elemente in einer Sammlung. Lösung. ... | foreach {Write-Host $ _}
this
ist ein ziemlich verwirrender Begriff für die $_
Variable. In OOP bezieht es sich normalerweise auf die Klasse, nicht auf eine Variable.
$ _ ist ein Alias für die automatische Variable $ PSItem (eingeführt in PowerShell V3.0; hier verwendete Verwendungsinformationen ), der das aktuelle Element aus der Pipe darstellt.
Die Online-Dokumentation zu PowerShell (v6.0) für automatische Variablen finden Sie hier .
$_
ist eine Variable, die vom System normalerweise in Blockausdrücken erstellt wird, auf die von Cmdlets verwiesen wird, die mit Pipe wie Where-Object
und verwendet werden ForEach-Object
.
Es kann aber auch in anderen Arten von Ausdrücken verwendet werden, beispielsweise in Select-Object
Kombination mit Ausdruckseigenschaften. Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}
. In diesem Fall $_
stellt das das Element dar, das weitergeleitet wird, es können jedoch mehrere Ausdrücke vorhanden sein.
Es kann auch durch benutzerdefinierte Parameterüberprüfung referenziert werden, wobei ein Skriptblock zum Überprüfen eines Werts verwendet wird. In diesem Fall $_
repräsentiert der den Parameterwert, wie er vom Aufruf empfangen wurde.
Die nächste Analogie zu c # und Java ist der Lamda-Ausdruck. Wenn Sie Powershell in Grundlagen zerlegen, ist alles ein Skriptblock, einschließlich einer Skriptdatei a, Funktionen und Cmdlets. Sie können Ihre eigenen Parameter definieren, aber in einigen Fällen wird vom System einer für Sie erstellt, der das zu verarbeitende / auszuwertende Eingabeelement darstellt . In diesen Situationen ist die automatische Variable $_
.