2010-08-16 21 views
160

He visto lo siguiente en PowerShell, pero ¿qué hace exactamente?

$_ 
+5

muy buena pregunta. Quiero más de esto para otros tokens oscuros – MattUebel

+2

La pregunta, por supuesto, ha sido respondida para el token especial dado, pero para un diagrama que ilustra _todos_ los tokens especiales de PowerShell, eche un vistazo a [La Guía Completa de Puntuación de PowerShell] (https://www.simple-talk.com/sysadmin/powershell/the-complete-guide-to-powershell-punctuation/) –

Respuesta

122

Esta es la variable para el valor actual en la línea de tubería.

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

Por ejemplo, en el código anterior el bloque de %{} se llama para cada valor de la matriz. La variable $_ contendrá el valor actual.

+31

No está necesariamente relacionado con la tubería. Es más un "argumento actual para el bloque de script que se está ejecutando actualmente". Por ejemplo, mientras que puedes usarlo bien en 'ForEach-Object' o' Where-Object' no puedes usarlo en algo como 'Get-Foo | Add-Member NoteProperty Bar ($ _. SomeProperty)' - hay una canal involucrado, pero no bloque de script y por lo tanto no '$ _'. (Dicho esto, la ayuda de PowerShell también se refiere a la interconexión para '$ _'. Confuso). – Joey

+2

@JaredPar Agregue información sobre $ PSItem siendo alias a $ _ desde PS3. – ALIENQuake

+0

@Joey, puede usar absolutamente $ _ en su ejemplo. 'Get-Foo | Add-Member -Type NoteProperty -Name Bar -Value $ _. SomeProperty ' – Xalorous

22

Según this sitio web, es una referencia a this, sobre todo en los bucles.

$ _ (subrayado en dólares) 'THIS' token. Por lo general, se refiere al elemento dentro de un bucle foreach. Tarea: Imprimir todos los elementos en una colección. Solución. ... | foreach {Write-Host $ _}

+0

+1 para el gran enlace – Micah

+13

+1 por un juego de palabras: 'De acuerdo con esto, es un referencia a esto'. – Neolisk

+1

'this' es un término bastante confuso para la variable' $ _'. En OOP generalmente se refiere a la clase, no a una variable. –

29

Creo que la manera más fácil de pensar sobre esta variable como parámetro de entrada en la expresión lambda en C#. Es decir. $_ es similar a x en x => Console.WriteLine(x) función anónima en C#. Considere siguientes ejemplos:

PowerShell:

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

Prints:

1 
2 
3 

o

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

Prints:

2 
3 

y comparar esto con sintaxis de C# utilizando 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)); 

Lienzo:

2 
3 
+3

En C# no use '_' como parámetro de entrada en lambda. '_' a veces se usa cuando se ignoran los parámetros, use x en su lugar. http://stackoverflow.com/questions/424775/is-there-a-better-way-to-express-a-parameterless-lambda-than –

1

$ _ es una variable que itera sobre cada objeto/elemento pasado desde el anterior | (tubo).

0

$_ es una variable creada por el sistema generalmente dentro de las expresiones de bloque a las que hacen referencia los cmdlets que se usan con las tuberías como Where-Object y ForEach-Object.

Pero se puede usar también en otros tipos de expresiones, por ejemplo con Select-Object combinado con propiedades de expresión. Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}. En este caso, el $_ representa el elemento que se canaliza, pero pueden existir múltiples expresiones.

También se puede hacer referencia a ella mediante la validación de parámetros personalizados, donde se usa un bloque de scripts para validar un valor. En este caso, el $_ representa el valor del parámetro recibido de la invocación.

La analogía más cercana a C# y java es la expresión lamda. Si desglosa PowerShell a lo básico, todo es un bloque de script que incluye un archivo de script a, funciones y cmdlets. Puede definir sus propios parámetros, pero en algunas ocasiones el sistema crea uno que representa el elemento de entrada para procesar/evaluar. En esas situaciones, la variable automática es $_.