2010-03-02 24 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

範圍界定問題。 foreach對象(%)腳本塊中的$ args對於該腳本塊是本地的。以下作品:

"`$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 2010-03-03 20:21:11

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運算符也可以使用數組!