2010-03-02 10 views
4

je ne peux pas comprendre pourquoi le code suivant échoue:

# test.ps1 
"`$args: ($args)" 
"`$args count: $($args.length)" 

# this fails 
0..$($args.length - 1) | %{ $args[$_] = ($args[$_] -replace '`n',"`n") } 

# this works 
$i = 0 
foreach ($el in $args) { $args[$i] = $args[$i] -replace '`n',"`n"; $i++ } 
"$args" 

J'appelle comme ceci:

rem from cmd.exe 
powershell.exe -noprofile -file test.ps1 "a`nb" "c" 

Répondre

7

Problème de portée. Le $ args dans le scriptbloc foreach-object (%) est local à ce scriptblock. Les travaux suivants:

"`$args: $args" 
"`$args count: $($args.length)" 
$a = $args 

# this fails 
0..$($args.length - 1) | %{ $a[$_] = ($a[$_] -replace '`n',"`n") } 
$a 
+1

J'ai finalement compris. En tant que variable automatique, '$ args' est et exception parce que chaque nouvelle portée reçoit ses propres arguments passés de la portée parent, par défaut' $ null'. C'est pourquoi une étendue imbriquée ne recherchera pas une variable '$ args' plus haut dans la pile de la portée. Anternativement à votre solution suggérée, '$ script: args' fonctionne aussi. À la vôtre, Keith. – guillermooo

2

Keith a répondu à cette question. Je voulais juste ajouter plus d'informations, parce que je l'ai trouvé utile plusieurs fois. Regardez le code:

[21]: function test{ 
>>  $args -replace '`n',"`n" 
>> } 
>> 
[22]: test 'replace all`nnew' 'lines`nin the `nstring' 'eof`ntest' 
replace all 
new 
lines 
in the 
string 
eof 
test 

L'opérateur travaille avec -replace tableau aussi!