Que signifie $ _ dans PowerShell?

226

J'ai beaucoup vu ce qui suit dans PowerShell, mais que fait-il exactement?

$_
Michée
la source
5
La question a bien sûr été résolue pour le seul jeton spécial donné, mais pour un wallchart illustrant tous les jetons spéciaux de PowerShell, jetez un œil au Guide complet de la ponctuation PowerShell
Michael Sorens

Réponses:

171

Il s'agit de la variable de la valeur actuelle dans la canalisation, qui est appelée $PSItemdans Powershell 3 et plus récent.

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

ou

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

Par exemple, dans le code ci-dessus, le %{}bloc est appelé pour chaque valeur du tableau. La variable $_ou $PSItemcontiendra la valeur actuelle.

JaredPar
la source
42
Ce n'est pas nécessairement lié au pipeline. Il s'agit plutôt d'un "argument actuel du bloc de script en cours d'exécution". Par exemple, alors que vous pouvez l'utiliser très bien ForEach-Objectou que Where-Objectvous ne pouvez pas l'utiliser dans quelque chose comme Get-Foo|Add-Member NoteProperty Bar ($_.SomeProperty)- il y a un pipeline impliqué, mais pas de bloc de script et donc non $_. (Cela étant dit, l'aide de PowerShell fait également référence au pipeline pour $_. Confus.)
Joey
@Joey, vous pouvez absolument utiliser $ _ dans votre exemple. Get-Foo | Add-Member -Type NoteProperty -Name Bar -Value $_.SomeProperty
Xalorous
@Xalorous: Ce n'est pas parce qu'il ne produit pas d'erreur que cela fonctionne: Get-ChildItem | Add-Member -Type NoteProperty -Name Bar -Value $_.Name -PassThru | Select Bar... Eh bien, cela peut fonctionner si vous avez un $_dans la portée où vous exécutez ce pipeline. Mais c'est très différent de ce que vous entendez habituellement lorsque vous essayez d'écrire quelque chose comme ça.
Joey
@Joey $_dans ce que vous avez écrit, pour une raison quelconque, ne passe pas en revue tous les objets. Essayez plutôt cela. gci | % { $_ | add-member -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar. Je soupçonne qu'avoir gci | cmdletsans foreach explicite recueille des résultats gci et passe un tableau à l'applet de commande. Cependant, le tableau est un objet, il ajoute donc une propriété à l'objet tableau. Le tableau n'a pas de propriété 'name', donc la valeur affectée à $ _. Bar est $ null. L'essentiel est que $ _ est largement utilisé avec pipelining. Ne pas avoir besoin de% {} pour boucler est nouveau.
Xalorous
Version de travail avec pipeline supplémentaire supprimé. gci | % { add-member -InputObject $_ -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
Xalorous
37

Je pense que la façon la plus simple de penser à cette variable comme paramètre d'entrée dans l'expression lambda en C #. À savoir $_est similaire à xen x => Console.WriteLine(x)fonction anonyme en C #. Considérez les exemples suivants:

PowerShell:

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

Tirages:

1
2
3

ou

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

Tirages:

2
3

Et comparez cela avec la syntaxe C # en utilisant LINQ:

var list = new List<int> { 1, 2, 3 };
list.ForEach( _ => Console.WriteLine( _ ));

Tirages:

1
2
3

ou

list.Where( _ => _ > 1)
    .ToList()
    .ForEach(s => Console.WriteLine(s));

Tirages:

2
3
Sergey Teplyakov
la source
6
En C # ne pas utiliser _comme paramètre d'entrée dans lambda. _est parfois utilisé lorsque les paramètres sont ignorés, utilisez plutôt x. stackoverflow.com/questions/424775/…
Carlos Muñoz
28

Selon ce site Web, il s'agit d'une référence à this, principalement dans les boucles.

$ _ (soulignement dollar) jeton 'CECI'. Fait généralement référence à l'élément dans une boucle foreach. Tâche: imprimer tous les éléments d'une collection. Solution. ... | foreach {Write-Host $ _}

Ikke
la source
3
thisest un terme assez déroutant pour la $_variable. En POO, il fait généralement référence à la classe, pas à une variable.
2015
1
@remco en particulier lorsque PS v5 ajoute une variable $ this pour une utilisation en classe.
Xalorous
5

$ _ est un alias pour la variable automatique $ PSItem (introduit dans PowerShell V3.0; informations d'utilisation trouvées ici ) qui représente l'élément actuel du tube.

La documentation en ligne de PowerShell (v6.0) pour les variables automatiques est ici .

Xalorous
la source
1

$ _ est une variable qui itère sur chaque objet / élément passé du précédent | (tuyau).

Facture
la source
1

$_est une variable créée par le système, généralement à l'intérieur d'expressions de bloc référencées par des applets de commande utilisées avec des canaux tels que Where-Objectet ForEach-Object.

Mais il peut également être utilisé dans d'autres types d'expressions, par exemple avec Select-Objectdes propriétés d'expression combinées. Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}. Dans ce cas, le $_représente l'élément en cours de canalisation mais plusieurs expressions peuvent exister.

Il peut également être référencé par la validation de paramètres personnalisés, où un bloc de script est utilisé pour valider une valeur. Dans ce cas, le $_représente la valeur de paramètre reçue de l'invocation.

L'analogie la plus proche de c # et java est l'expression lamda. Si vous décomposez PowerShell aux bases, tout est un bloc de script, y compris un fichier de script a, des fonctions et des applets de commande. Vous pouvez définir vos propres paramètres, mais dans certains cas, un système est créé par le système pour vous et représente l'élément d'entrée à traiter / évaluer . Dans ces situations, la variable automatique est $_.

Alex Sarafian
la source