Ho visto molto quanto segue in PowerShell, ma cosa fa esattamente?
$_
Ho visto molto quanto segue in PowerShell, ma cosa fa esattamente?
$_
Questa è la variabile per il valore corrente nella linea del tubo.
1,2,3 | %{ write-host $_ }
Ad esempio nel codice sopra il blocco %{}
viene chiamata per ogni valore della matrice. La variabile $_
conterrà il valore corrente.
Non è necessariamente correlato alla pipeline. È più un "argomento corrente al blocco di script attualmente in esecuzione". Ad esempio, mentre puoi usarlo bene in 'ForEach-Object' o' Where-Object' non puoi usarlo in qualcosa come 'Get-Foo | Add-Member NoteProperty Bar ($ _. SomeProperty)' - c'è un pipeline coinvolta, ma nessun blocco di script e quindi nessun '$ _'. (Detto questo, l'aiuto di PowerShell si riferisce anche alla pipeline per '$ _'. Confusione.) – Joey
@JaredPar Si prega di aggiungere informazioni su $ PSItem che è alias su $ _ da PS3. – ALIENQuake
@Joey puoi assolutamente usare $ _ nel tuo esempio. 'Get-Foo | Add-Member -Type NoteProperty -Name Bar -Value $ _. SomeProperty ' – Xalorous
Secondo this sito web, è un riferimento a this
, per lo più in loop.
$ _ (dollaro di sottolineatura) "QUESTO" token. Si riferisce in genere all'articolo all'interno di un ciclo foreach. Attività: Stampa tutti gli elementi di una raccolta. Soluzione. ... | foreach {Host di scrittura $ _}
Penso che il modo più semplice per pensare a questa variabile come parametro di input nell'espressione lambda in C#. Cioè $_
è simile a x
in x => Console.WriteLine(x)
funzione anonima in C#. Considerate seguenti esempi:
PowerShell:
1,2,3 | ForEach-Object {Write-Host $_}
Stampe:
1
2
3
o
1,2,3 | Where-Object {$_ -gt 1}
Prints:
2
3
e confrontare questo con sintassi C# utilizzando LINQ:
var list = new List<int> { 1, 2, 3 };
list.ForEach(_ => Console.WriteLine(_));
Prints:
1
2
3
o
list.Where(_ => _ > 1)
.ToList()
.ForEach(s => Console.WriteLine(s));
Stampe:
2
3
In C# non utilizzare '_' come parametro di input in lambda. '_' è usato a volte quando i parametri vengono ignorati, usa invece x. http://stackoverflow.com/questions/424775/is-there-a-better-way-to-express-a-parameterless-lambda-than –
$ _ è una variabile cheitera su ogni oggetto/elemento passato dal precedente | (tubo).
$ _ è un alias per variabile automatica $ PSItem (introdotto in PowerShell V3.0; Usage information found here) che rappresenta l'elemento corrente dalla pipe.
$_
è una variabile creata dal sistema in genere all'interno di espressioni di blocco a cui fanno riferimento i cmdlet utilizzati con pipe come Where-Object
e ForEach-Object
.
Ma può essere utilizzato anche in altri tipi di espressioni, ad esempio con Select-Object
combinato con le proprietà di espressione. Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}
. In questo caso, $_
rappresenta l'elemento che viene reindirizzato, ma possono esistere più espressioni.
È inoltre possibile fare riferimento alla convalida dei parametri personalizzati, in cui un blocco di script viene utilizzato per convalidare un valore. In questo caso, $_
rappresenta il valore del parametro ricevuto dal richiamo.
L'analogia più vicina a C# e java è l'espressione lamda. Se si analizzano le basi di PowerShell, tutto è un blocco di script che include un file di script, funzioni e cmdlet. È possibile definire i propri parametri ma in alcune occasioni viene creato dal sistema per voi che rappresenta l'elemento di input da elaborare/valutare. In quelle situazioni la variabile automatica è $_
.
domanda molto bella. Voglio più informazioni per altri sconosciuti token – MattUebel
La domanda ha, naturalmente, ricevuto risposta per il singolo token speciale fornito, ma per un wallchart che illustra tutti i token speciali di PowerShell, dai un'occhiata a [La guida completa alla punteggiatura di PowerShell] (https://www.simple-talk.com/sysadmin/powershell/the-complet-guide-to-powershell-punctuation/) –