He visto mucho lo siguiente en PowerShell, pero ¿qué hace exactamente?
$_
He visto mucho lo siguiente en PowerShell, pero ¿qué hace exactamente?
$_
Respuestas:
Esta es la variable para el valor actual en la línea de tubería, que se llama $PSItem
en Powershell 3 y versiones posteriores.
1,2,3 | %{ write-host $_ }
o
1,2,3 | %{ write-host $PSItem }
Por ejemplo, en el código anterior %{}
, se llama al bloque para cada valor de la matriz. La variable $_
o $PSItem
contendrá el valor actual.
ForEach-Object
o Where-Object
no puede usarlo en algo como Get-Foo|Add-Member NoteProperty Bar ($_.SomeProperty)
: hay una tubería involucrada, pero no hay bloque de script y, por lo tanto, no $_
. (Dicho esto, la ayuda de PowerShell también se refiere a la tubería para $_
. Confuso.)
Get-Foo | Add-Member -Type NoteProperty -Name Bar -Value $_.SomeProperty
Get-ChildItem | Add-Member -Type NoteProperty -Name Bar -Value $_.Name -PassThru | Select Bar
... Bueno, puede funcionar si tiene un $_
alcance en el que está ejecutando esa canalización. Pero eso es muy diferente de lo que generalmente quieres decir cuando tratas de escribir algo así.
$_
en lo que escribiste es, por alguna razón, no recorrer todos los objetos. Intenta esto en su lugar. gci | % { $_ | add-member -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
. Sospecho que tener gci | cmdlet
sin el foreach explícito es recopilar resultados de gci y pasar una matriz al cmdlet. Sin embargo, la matriz es un objeto, por lo que agrega una propiedad al objeto matriz. La matriz no tiene una propiedad 'nombre', por lo que el valor asignado a $ _. Bar es $ nulo. La conclusión es que $ _ se usa ampliamente con la canalización. No necesitar%% para recorrer es nuevo.
gci | % { add-member -InputObject $_ -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
Creo que la forma más fácil de pensar acerca de esta variable como parámetro de entrada en la expresión lambda en C #. Es decir, $_
es similar a la x
de x => Console.WriteLine(x)
función anónima en C #. Considere los siguientes ejemplos:
Potencia Shell:
1,2,3 | ForEach-Object {Write-Host $_}
Huellas dactilares:
1
2
3
o
1,2,3 | Where-Object {$_ -gt 1}
Huellas dactilares:
2
3
Y compare esto con la sintaxis de C # usando LINQ:
var list = new List<int> { 1, 2, 3 };
list.ForEach( _ => Console.WriteLine( _ ));
Huellas dactilares:
1
2
3
o
list.Where( _ => _ > 1)
.ToList()
.ForEach(s => Console.WriteLine(s));
Huellas dactilares:
2
3
_
como parámetro de entrada en lambda. _
a veces se usa cuando se ignoran los parámetros, use x en su lugar. stackoverflow.com/questions/424775/…
Según este sitio web, es una referencia this
, principalmente en bucles.
$ _ (subrayado en dólares) 'ESTE' token. Típicamente se refiere al elemento dentro de un bucle foreach. Tarea: Imprimir todos los artículos en una colección. Solución. ... | foreach {Write-Host $ _}
this
Es un término bastante confuso para la $_
variable. En OOP generalmente se refiere a la clase, no a una variable.
$ _ es un alias para la variable automática $ PSItem (introducido en PowerShell V3.0; información de uso que se encuentra aquí ) que representa el elemento actual de la tubería.
La documentación en línea de PowerShell (v6.0) para variables automáticas está aquí .
$_
es una variable creada por el sistema, generalmente dentro de expresiones de bloque a las que hacen referencia los cmdlets que se usan con tuberías como Where-Object
y ForEach-Object
.
Pero también se puede usar en otros tipos de expresiones, por ejemplo, Select-Object
combinadas con propiedades de expresión. Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}
. En este caso, $_
representa el elemento que se está canalizando, pero pueden existir múltiples expresiones.
También se puede hacer referencia mediante la validación de parámetros personalizados, donde se utiliza un bloque de script para validar un valor. En este caso, $_
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 divide PowerShell en conceptos básicos, entonces 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 para usted que representa el elemento de entrada para procesar / evaluar . En esas situaciones la variable automática es $_
.