¿Qué significa $ _ en PowerShell?


Respuestas:


171

Esta es la variable para el valor actual en la línea de tubería, que se llama $PSItemen 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 $PSItemcontendrá el valor actual.


42
No está necesariamente relacionado con la tubería. Es más un "argumento actual para el bloque de script actualmente en ejecución". Por ejemplo, si bien puede usarlo bien ForEach-Objecto Where-Objectno 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.)
Joey

@Joey absolutamente puedes usar $ _ en tu ejemplo. Get-Foo | Add-Member -Type NoteProperty -Name Bar -Value $_.SomeProperty
Xalorous

@Xalorous: el hecho de que no produzca un error no significa que funcione: 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í.
Joey

@Joey $_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 | cmdletsin 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.
Xalorous

Versión de trabajo con tubería adicional eliminada. gci | % { add-member -InputObject $_ -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
Xalorous

37

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 xde 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

66
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. stackoverflow.com/questions/424775/…
Carlos Muñoz

28

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


3
thisEs un término bastante confuso para la $_variable. En OOP generalmente se refiere a la clase, no a una variable.
2015

1
@remco, especialmente cuando PS v5 agrega una variable $ this para usar en clases.
Xalorous


1

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


1

$_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-Objecty ForEach-Object.

Pero también se puede usar en otros tipos de expresiones, por ejemplo, Select-Objectcombinadas 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 $_.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.