2010-03-02 4 views
4

Я не могу понять, почему следующий код не:

# 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" 

Я звоню это так:

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

ответ

7

Предметный указатель. $ Args внутри скрипта-скрипта foreach-object (%) является локальным для этого скриптового блока. Следующие работы:

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

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

Я, наконец, понял. Являясь автоматической переменной, '$ args' является и исключением, потому что каждая новая область получает свои собственные аргументы, переданные из родительской области, по умолчанию« $ null ». Вот почему вложенная область не будет искать переменную '$ args', а затем увеличивать стек области. Альтернативно вашему предложенному решению, '$ script: args' тоже работает. Привет, Кит. – guillermooo

2

Keith ответил на этот вопрос. Просто хотел добавить дополнительную информацию, потому что я нашел ее полезной много раз. Посмотрите на код:

[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 

Оператор -replace работает с массивом тоже!

 Смежные вопросы

  • Нет связанных вопросов^_^