Wiele razy widziałem w PowerShell, ale co to dokładnie robi?
$_
powershell
Micheasz
źródło
źródło
Odpowiedzi:
Jest to zmienna dla bieżącej wartości w rurociągu, która jest wywoływana
$PSItem
w Powershell 3 i nowszych.lub
Na przykład w powyższym kodzie
%{}
blok jest wywoływany dla każdej wartości w tablicy.$_
Czy$PSItem
zmienna zawiera aktualną wartość.źródło
ForEach-Object
lubWhere-Object
nie możesz użyć go w czymś takimGet-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 posiadaniegci | 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 dox
wx => Console.WriteLine(x)
anonimowej funkcji w języku C #. Rozważ następujące przykłady:PowerShell:
Wydruki:
lub
Wydruki:
I porównaj to ze składnią C # za pomocą LINQ:
Wydruki:
lub
Wydruki:
źródło
_
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.źródło
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 .
źródło
$ _ jest zmienną, która iteruje każdy obiekt / element przekazany z poprzedniego | (rura).
źródło
$_
jest zmienną utworzoną przez system, zwykle wewnątrz wyrażeń blokowych, do których odwołują się polecenia cmdlet używane z potokiem, takim jakWhere-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
$_
.źródło