2012-04-25 28 views
2

一個簡單的例子,我不知道如何得到它的工作...PowerShell的替換功能奇怪的行爲

function replace($rep, $by){ 
    Process { $_ -replace $rep, $by } 
} 

當我做

"test" | replace("test", "foo") 

結果是

test 

當我做

function replace(){ 
    Process { $_ -replace "test", "foo" } 
} 

"test" | replace() 

結果是

foo 

什麼想法?

回答

3

功能遵循相同的參數規則cmdlet和本機命令,也就是說,參數是用空格隔開(是的,這也意味着你不需要引用你的論點,因爲它們是自動解釋爲在解析模式字符串):

'test' | replace test foo 

所以,如果你帶有參數的功能的PowerShell cmdlet的或在括號中你會得到一個參數是函數中的數組。對象上的方法的調用遵循其他規則(這看起來大致類似於C#)。

爲了詳細一點:PowerShell有在它解析線兩種不同的模式:表達模式命令模式。在表達模式下,PowerShell的行爲類似於REPL。您可以輸入1+1並獲得2,或輸入'foo' -replace 'o'並獲得f。命令模式用於模擬shell的行爲。那時你想運行命令,例如Get-ChildItem& 'C:\Program Files\Foo\foo.exe' bar blah。括號內的模式確定重新開始,這就是爲什麼Write-Host (Get-ChildItem)Write-Host Get-ChildItem不同。

+0

謝謝!昨天啓動了powershell,我缺乏這種基礎。 – rbag 2012-04-25 08:10:31

+0

起初可能有點混淆,尤其是來自C語言或Unix shell,但語言設計師仔細努力,以便您可以學習一些概念並在使用PowerShell時重新應用它們。一個小提示:'filter'與''''具有'process'模塊相同的行爲,所以你可以簡化你的代碼來過濾替換($ rep,$ by){$ _ -replace $ rep,$ by }來自c#的' – Joey 2012-04-25 08:12:20

+0

有時會讓人困惑,但是powershell似乎是一個非常強大的替代方案,可以用來讀取不可讀的vbs腳本或c#編譯的應用程序。 thx爲過濾器技巧! – rbag 2012-04-25 08:27:05

0

刪除函數調用中的()和remove comma。在PowerShell中

"test" | replace "test" "foo"