Que signifie $ _ dans PowerShell?


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.


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

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


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


1

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


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.