2010-08-16 27 views
160

Ho visto molto quanto segue in PowerShell, ma cosa fa esattamente?

$_ 
+5

domanda molto bella. Voglio più informazioni per altri sconosciuti token – MattUebel

+2

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/) –

risposta

122

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.

+31

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

+2

@JaredPar Si prega di aggiungere informazioni su $ PSItem che è alias su $ _ da PS3. – ALIENQuake

+0

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

22

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 $ _}

+0

+1 per l'ottimo link – Micah

+13

+1 per un gioco di parole: "Secondo questo, è un riferimento a questo ». – Neolisk

+1

'this' è un termine piuttosto confuso per la variabile' $ _'. In OOP di solito si riferisce alla classe, non una variabile. –

29

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 
+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 –

1

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

0

$_ è 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 è $_.