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 $PSItem
in 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 $PSItem
conterrà il valore corrente.
ForEach-Object
o Where-Object
non 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 | cmdlet
senza 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 x
inx => 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-Object
eForEach-Object
.
Ma può essere utilizzato anche in altri tipi di espressioni, ad esempio in Select-Object
combinazione 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 è $_
.