Ich habe in PowerShell viel Folgendes gesehen, aber was macht es genau?
$_
powershell
Micah
quelle
quelle
Antworten:
Dies ist die Variable für den aktuellen Wert in der Rohrleitung, die
$PSItem
in Powershell 3 und höher aufgerufen wird .oder
Im obigen Code wird der
%{}
Block beispielsweise für jeden Wert im Array aufgerufen. Die Variable$_
oder$PSItem
enthält den aktuellen Wert.quelle
ForEach-Object
oderWhere-Object
Sie können es nicht in so etwas wie verwendenGet-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, dassgci | 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 wiex
inx => Console.WriteLine(x)
anonymer Funktion in C #. Betrachten Sie folgende Beispiele:Power Shell:
Drucke:
oder
Drucke:
Und vergleichen Sie dies mit der C # -Syntax unter Verwendung von LINQ:
Drucke:
oder
Drucke:
quelle
_
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.quelle
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 .
quelle
$ _ ist eine Variable, die über jedes Objekt / Element iteriert, das vom vorherigen | übergeben wurde (Rohr).
quelle
$_
ist eine Variable, die vom System normalerweise in Blockausdrücken erstellt wird, auf die von Cmdlets verwiesen wird, die mit Pipe wieWhere-Object
und verwendet werdenForEach-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
$_
.quelle