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 $PSItem
dans 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 $PSItem
contiendra la valeur actuelle.
ForEach-Object
ou que Where-Object
vous 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 | cmdlet
sans 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 à x
en 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 $ _}
this
est 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-Object
et ForEach-Object
.
Mais il peut également être utilisé dans d'autres types d'expressions, par exemple avec Select-Object
des 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 $_
.