2012-10-25 15 views
5

Powiel możliwe:
What does $_ mean in powershell?

już widać czyjeś question and answer na ten sam temat, ale dla mnie to nie jest odpowiedź na pytanie.

wiem jak używać Select-Object, Where-Object, ForEach-Object itp i przekazać blok skryptu, na przykład:

dir | ForEach-Object { $_.Name } 

która zwraca tablicę wszystkich nazw plików w bieżącym katalogu .

ta jest podobna do C# 's Wybierz metodę rozszerzenia:

Dir.Select(x => x.Name) 

Jednakże powyższe C# jest łatwo zrozumiałe, ponieważ przechodzą funkcję do metody Select, który następnie uruchamia go dla każdego elementu listy.

Jednak równowartość w PowerShell:

dir | ForEach-Object { param($x) $x.Name } 

niczego nie powrócić. Jednak

& { param($x) $x.Name } (dir)[0] 

działa zgodnie z oczekiwaniami.

Czy ktoś może wytłumaczyć magię $ _ komuś znanemu w C#, ale nie światu skryptów? To jest specjalne słowo kluczowe? Czy można go używać tylko w blokach skryptów przekazywanych do cmdletów? W jaki sposób wywołuje się jeden bez wyprowadzania jednego do ForEach-Object (lub innego cmdlet)? tj .:

& { $_.Name } (dir)[0] 

?

+1

To nie jest dokładny duplikat innego pytania (które powiedziałem w pierwszym wierszu tego pytania). * Inne * pytanie prosi o to, * jak * użyć * go, a nie co oznacza * oznacza *. Możesz powiedzieć, że to nie duplikat, ponieważ akceptowane odpowiedzi są różne. Odpowiedź zdana pokazuje, że możliwe jest bezpośrednie przesyłanie czegoś do filtra, podczas gdy odpowiedź JaredPar pokazuje, że coś jest podłączone do ForEach-Object. Różnica między nimi polega na bezpośrednim wywołaniu filtra lub przepuszczeniu filtra do innego filtra, który następnie wykonuje go. –

Odpowiedz

8

Obiekt $_ jest tworzony tylko w kontekście potoku, czyli przekazywania obiektów wyjściowych z jednego polecenia do "wejścia" innego. W przypadku filtrów potokowych (które są podobnymi funkcjami), funkcja powershell automatycznie wypełnia zmienną $_ obiektem obiektu potoku. Teraz mówię "aktualny", ponieważ ważne jest, aby pamiętać, że gdy wiele obiektów jest przekazywanych do potoku, blok skryptów procesu twojego filtra jest wykonywany raz na obiekt.

Teraz możesz zmienić nazwy obiektów rurociągu na jeden z parametrów wejściowych, ale musisz powiedzieć powershell, że to robisz. Na przykład:

# C:\> filter get-name-filt {Param([parameter(ValueFromPipeline=$true)]$x) $x.name} 
# C:\> (dir)[0] | get-name-filt 

co nie jest bardzo wygodne w linii poleceń, stąd automatyczna zmienna $ _.

+0

Dzięki tej odpowiedzi doskonale wyjaśnia, co to jest $ _. –

2

$_ jest bieżącym elementem rozliczeniowym.

Na przykład:

dir | ForEach-Object { $_.Name } 

oznacza:

  1. Uruchom Polecenie dir
  2. Przepuścić wyjściowe do następnego polecenia rurociągu
  3. ForEach-Object wykorzystuje wyjście z dir jako zmienna o nazwie $ _

Ponieważ wyjście z dir ma właściwość .name, wówczas potokowy $_ będzie miał tę samą właściwość. Jest to po prostu sposób przekazywania danych w rurze