J'ai beaucoup vu ce qui suit dans PowerShell, mais que fait-il exactement?
$_
powershell
Michée
la source
la source
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.ou
Par exemple, dans le code ci-dessus, le
%{}
bloc est appelé pour chaque valeur du tableau. La variable$_
ou$PSItem
contiendra la valeur actuelle.la source
ForEach-Object
ou queWhere-Object
vous ne pouvez pas l'utiliser dans quelque chose commeGet-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'avoirgci | 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
enx => Console.WriteLine(x)
fonction anonyme en C #. Considérez les exemples suivants:PowerShell:
Tirages:
ou
Tirages:
Et comparez cela avec la syntaxe C # en utilisant LINQ:
Tirages:
ou
Tirages:
la source
_
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.la source
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 .
la source
$ _ est une variable qui itère sur chaque objet / élément passé du précédent | (tuyau).
la source
$_
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 queWhere-Object
etForEach-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
$_
.la source