Wiele razy widziałem w PowerShell, ale co to dokładnie robi?
$_
Wiele razy widziałem w PowerShell, ale co to dokładnie robi?
$_
Odpowiedzi:
Jest to zmienna dla bieżącej wartości w rurociągu, która jest wywoływana $PSItem
w Powershell 3 i nowszych.
1,2,3 | %{ write-host $_ }
lub
1,2,3 | %{ write-host $PSItem }
Na przykład w powyższym kodzie %{}
blok jest wywoływany dla każdej wartości w tablicy. $_
Czy $PSItem
zmienna zawiera aktualną wartość.
ForEach-Object
lub Where-Object
nie możesz użyć go w czymś takim Get-Foo|Add-Member NoteProperty Bar ($_.SomeProperty)
- jest zaangażowany potok, ale nie ma bloku skryptu, a zatem nie $_
. (To powiedziawszy, pomoc PowerShell odnosi się również do potoku $_
. Mylące.)
Get-Foo | Add-Member -Type NoteProperty -Name Bar -Value $_.SomeProperty
Get-ChildItem | Add-Member -Type NoteProperty -Name Bar -Value $_.Name -PassThru | Select Bar
... Cóż, może działać, jeśli masz $_
zakres, w którym wykonujesz ten potok. Ale to bardzo różni się od tego, co zwykle masz na myśli, gdy piszesz coś takiego.
$_
w tym, co napisałeś, z jakiegoś powodu nie zapętla wszystkich obiektów. Spróbuj tego zamiast tego. gci | % { $_ | add-member -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
. Podejrzewam, że posiadanie gci | cmdlet
bez jawnego foreach zbiera wyniki gci i przekazuje tablicę do cmdletu. Jednak tablica jest obiektem, więc dodaje właściwość do obiektu tablicy. Tablica nie ma właściwości „name”, więc wartość przypisana do $ _. Pasek ma wartość $ null. Najważniejsze jest to, że $ _ jest szeroko stosowane w / potokach. Nie potrzeba% {} do przejścia przez pętlę jest nowy.
gci | % { add-member -InputObject $_ -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
Myślę, że najłatwiejszym sposobem myślenia o tej zmiennej jest parametr wejściowy w wyrażeniu lambda w języku C #. Czyli $_
jest podobny do x
w x => Console.WriteLine(x)
anonimowej funkcji w języku C #. Rozważ następujące przykłady:
PowerShell:
1,2,3 | ForEach-Object {Write-Host $_}
Wydruki:
1
2
3
lub
1,2,3 | Where-Object {$_ -gt 1}
Wydruki:
2
3
I porównaj to ze składnią C # za pomocą LINQ:
var list = new List<int> { 1, 2, 3 };
list.ForEach( _ => Console.WriteLine( _ ));
Wydruki:
1
2
3
lub
list.Where( _ => _ > 1)
.ToList()
.ForEach(s => Console.WriteLine(s));
Wydruki:
2
3
_
jako parametru wejściowego w lambda. _
jest czasami używany, gdy parametry są ignorowane, zamiast tego użyj x. stackoverflow.com/questions/424775/…
Według tej witryny jest to odniesienie this
, głównie w pętlach.
$ _ (podkreślenie dolara) token „TO”. Zazwyczaj odnosi się do przedmiotu w pętli foreach. Zadanie: wydrukuj wszystkie elementy w kolekcji. Rozwiązanie. ... | foreach {Write-Host $ _}
this
jest raczej mylącym terminem dla $_
zmiennej. W OOP zwykle odnosi się do klasy, a nie do zmiennej.
$ _ to alias dla automatycznej zmiennej $ PSItem (wprowadzony w PowerShell V3.0; informacje o użyciu można znaleźć tutaj ), która reprezentuje bieżący element z potoku.
Dokumentacja online programu PowerShell (wersja 6.0) dla zmiennych automatycznych znajduje się tutaj .
$_
jest zmienną utworzoną przez system, zwykle wewnątrz wyrażeń blokowych, do których odwołują się polecenia cmdlet używane z potokiem, takim jak Where-Object
iForEach-Object
.
Ale można go również stosować w innych typach wyrażeń, na przykład w Select-Object
połączeniu z właściwościami wyrażeń. Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}
. W tym przypadku$_
reprezentuje przesyłany element, ale może istnieć wiele wyrażeń.
Można się do niego odwoływać również poprzez niestandardowe sprawdzanie poprawności parametrów, gdzie blok skryptu służy do sprawdzania poprawności wartości. W tym przypadku $_
reprezentuje wartość parametru otrzymaną z wywołania.
Najbliższą analogią do c # i java jest wyrażenie lamda. Jeśli podzielisz PowerShell na podstawy, wszystko to blok skryptu, w tym plik skryptu a, funkcje i polecenia cmdlet. Możesz zdefiniować własne parametry, ale w niektórych przypadkach system tworzy taki, który reprezentuje element wejściowy do przetworzenia / oceny . W takich sytuacjach zmienną automatyczną jest $_
.