J'ai beaucoup vu ce qui suit dans PowerShell, mais que fait-il exactement?
$_
J'ai beaucoup vu ce qui suit dans PowerShell, mais que fait-il exactement?
$_
Réponses:
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.
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.)
Get-Foo | Add-Member -Type NoteProperty -Name Bar -Value $_.SomeProperty
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.
$_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.
gci | % { add-member -InputObject $_ -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
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
_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/…
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 $ _}
thisest un terme assez déroutant pour la $_variable. En POO, il fait généralement référence à la classe, pas à une variable.
$ _ 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 .
$_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 $_.