Cosa significa $ _ in PowerShell?


Risposte:


171

Questa è la variabile per il valore corrente nella linea di pipe, che viene chiamata $PSItemin Powershell 3 e versioni successive.

1,2,3 | %{ write-host $_ } 

o

1,2,3 | %{ write-host $PSItem } 

Ad esempio nel codice sopra, il %{}blocco viene chiamato per ogni valore nell'array. La variabile $_o $PSItemconterrà il valore corrente.


42
Non è necessariamente correlato alla pipeline. È più un "argomento attuale per il blocco di script attualmente in esecuzione". Ad esempio, mentre puoi usarlo bene ForEach-Objecto Where-Objectnon puoi usarlo in qualcosa del genere Get-Foo|Add-Member NoteProperty Bar ($_.SomeProperty)- c'è una pipeline coinvolta, ma nessun blocco di script e quindi no $_. (Detto questo, l'aiuto di PowerShell si riferisce anche alla pipeline per $_. Confuso.)
Joey

@Joey puoi assolutamente usare $ _ nel tuo esempio. Get-Foo | Add-Member -Type NoteProperty -Name Bar -Value $_.SomeProperty
Xalorous,

@Xalorous: Solo perché non produce un errore non significa che funzioni: Get-ChildItem | Add-Member -Type NoteProperty -Name Bar -Value $_.Name -PassThru | Select Bar... Beh, può funzionare se hai un $_ambito in cui stai eseguendo quella pipeline. Ma è molto diverso da ciò che intendi di solito quando cerchi di scrivere qualcosa del genere.
Joey,

@Joey $_in quello che hai scritto è, per qualche motivo, non scorrere in loop tutti gli oggetti. Prova questo invece. gci | % { $_ | add-member -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar. Ho il sospetto che avere gci | cmdletsenza la foreach esplicita stia raccogliendo risultati gci e passando un array al cmdlet. Tuttavia, l'array è un oggetto, quindi sta aggiungendo una proprietà all'oggetto array. L'array non ha una proprietà 'name', quindi il valore assegnato a $ _. Bar è $ null. La linea di fondo è che $ _ è ampiamente utilizzato con pipeline. Non è necessario% {} per eseguire il ciclo continuo è una novità.
Xalorous,

Versione funzionante con pipeline aggiuntiva rimossa. gci | % { add-member -InputObject $_ -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
Xalorous,

37

Penso che il modo più semplice di pensare a questa variabile come il parametro di input nell'espressione lambda in C #. Cioè $_è simile a xinx => Console.WriteLine(x) funzione anonima in C #. Considera i seguenti esempi:

PowerShell:

1,2,3 | ForEach-Object {Write-Host $_}

stampe:

1
2
3

o

1,2,3 | Where-Object {$_ -gt 1}

stampe:

2
3

E confronta questo con la sintassi C # usando LINQ:

var list = new List<int> { 1, 2, 3 };
list.ForEach( _ => Console.WriteLine( _ ));

stampe:

1
2
3

o

list.Where( _ => _ > 1)
    .ToList()
    .ForEach(s => Console.WriteLine(s));

stampe:

2
3

6
In C # non usare _come parametro di input in lambda. _viene talvolta utilizzato quando i parametri vengono ignorati, utilizzare invece x. stackoverflow.com/questions/424775/…
Carlos Muñoz,

28

Secondo questo sito Web, si tratta di un riferimento this, principalmente nei loop.

$ _ (segno di sottolineatura in dollari) Token 'QUESTO'. In genere si riferisce all'elemento all'interno di un ciclo foreach. Attività: stampare tutti gli elementi in una raccolta. Soluzione. ... | foreach {Write-Host $ _}


3
thisè un termine piuttosto confuso per la $_variabile. In OOP di solito si riferisce alla classe, non a una variabile.
o

1
@remco specialmente quando PS v5 aggiunge una variabile $ per l'uso nelle classi.
Xalorous,


1

$ _ è una variabile che scorre su ogni oggetto / elemento passato dal precedente | (tubo).


1

$_è una variabile creata dal sistema solitamente all'interno delle espressioni di blocco a cui fanno riferimento i cmdlet utilizzati con pipe come Where-ObjecteForEach-Object .

Ma può essere utilizzato anche in altri tipi di espressioni, ad esempio in Select-Objectcombinazione con le proprietà dell'espressione. Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}. In questo caso il$_ rappresenta l'elemento da pipare ma possono esistere più espressioni.

Può anche essere referenziato dalla convalida dei parametri personalizzati, in cui viene utilizzato un blocco di script per convalidare un valore. In questo caso il$_ rappresenta il valore del parametro ricevuto dall'invocazione.

L'analogia più vicina a c # e java è l'espressione lamda. Se si suddivide PowerShell in base, tutto è un blocco di script che include un file di script a, funzioni e cmdlet. È possibile definire i propri parametri, ma in alcune occasioni ne viene creato uno dal sistema che rappresenta l'elemento di input da elaborare / valutare . In quelle situazioni la variabile automatica è $_.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.