He visto lo siguiente en PowerShell, pero ¿qué hace exactamente?
$_
He visto lo siguiente en PowerShell, pero ¿qué hace exactamente?
$_
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.
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
@JaredPar Agregue información sobre $ PSItem siendo alias a $ _ desde PS3. – ALIENQuake
@Joey, puede usar absolutamente $ _ en su ejemplo. 'Get-Foo | Add-Member -Type NoteProperty -Name Bar -Value $ _. SomeProperty ' – Xalorous
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 $ _}
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
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 –
$ _ es una variable que itera sobre cada objeto/elemento pasado desde el anterior | (tubo).
$ _ es un alias para la variable automática $ PSItem (introducido en PowerShell V3.0; Usage information found here) que representa el elemento actual de la tubería.
$_
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 $_
.
muy buena pregunta. Quiero más de esto para otros tokens oscuros – MattUebel
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/) –