Ho visto molto quanto segue in PowerShell, ma cosa fa esattamente?
$_
Ho visto molto quanto segue in PowerShell, ma cosa fa esattamente?
$_
Risposte:
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.
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.)
Get-Foo | Add-Member -Type NoteProperty -Name Bar -Value $_.SomeProperty
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.
$_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à.
gci | % { add-member -InputObject $_ -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
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
_come parametro di input in lambda. _viene talvolta utilizzato quando i parametri vengono ignorati, utilizzare invece x. stackoverflow.com/questions/424775/…
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 $ _}
thisè un termine piuttosto confuso per la $_variabile. In OOP di solito si riferisce alla classe, non a una variabile.
$ _ è un alias per la variabile automatica $ PSItem (introdotta in PowerShell V3.0; le informazioni sull'utilizzo sono disponibili qui ) che rappresenta l'elemento corrente dalla pipe.
La documentazione online di PowerShell (v6.0) per le variabili automatiche è qui .
$_è 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 è $_.