2009-01-16 6 views
3

La variable $ args devrait, par définition, contenir tous les arguments passés à une fonction de script. Cependant, si je construis un pipeline dans ma fonction, la variable $ args est nulle. Quelqu'un sait pourquoi?

Voir cet exemple:

function test { 1..3 | % { echo "args inside pipeline: $args" } ; echo "args outside pipeline: $args" } 

Ceci est la sortie, lorsque le passage de paramètres "bonjour":

PS> test hello 
args inside pipeline: 
args inside pipeline: 
args inside pipeline: 
args outside pipeline: hello 

Y at-il une raison particulière à cela? Je sais comment contourner cela, mais je me demande si anonye peut expliquer la raison de cela.

Répondre

5

Les tubes utilisent $ input. Essayez ceci:

function test { 1..3 | % { echo "args inside pipeline: $input" } ; echo "args outside pipeline: $args" } 
+0

Ok merci. Cependant je dirais toujours que ce comportement est très étrange. Et selon les développeurs, ils ont essayé de le concevoir en utilisant le principe de la plus petite surprise;) – driAn

+0

Pour expliquer ce qui se passe ici, $ args contient tous les arguments non capturés (à défaut d'un meilleur terme) pour une commande. Dans votre exemple de pipeline, vous demandez des left args $ à partir de la commande ForEach-Object (%), car c'est le contexte dans lequel le bloc de script sera évalué. – JasonMArcher

+0

Ce genre de chose se produit également avec la variable automatique $ _ . Vous devez regarder dans quel contexte il se trouve. – JasonMArcher