2012-03-29 71 views
3

我需要在遠程計算機上運行ps1腳本。腳本將傳遞一個代表文件名的參數。我嘗試了許多不同的組合和方法來將參數傳遞給腳本塊,但當嘗試支持腳本名稱和/或文件名中的空格時,我總是收到一個或另一個錯誤如何將引用的參數傳遞給PowerShell Invoke-Command和ScripBlocks

注:最終的結果將是一個遠程計算機上使用-Co​​mputerName參數來調用命令,但爲了簡單起見運行腳本和測試所有的例子在本地運行。

給出的樣本 「遠程」 腳本

#processFile.ps1 
$args[0]  # just outputs the first parameter passed 

的時候有在名稱中沒有空格

$cmd = ".\processFile.ps1" 
$fn = "someFile.csv" 
$sb = [ScriptBlock]::Create("$cmd $fn") 
Invoke-Command -ScriptBlock $sb 

# outputs the correct 
someFile.csv 

但是以下的工作,下面不工作

$cmd = ".\processFile.ps1" 
$fn = "some File.csv" 
$sb = [ScriptBlock]::Create("$cmd $fn") 
Invoke-Command -ScriptBlock $sb 

# outputs the incorrect 
some 

顯然,文件名參數需要轉義並作爲「一些文件」傳遞。 CSV」。這可以用下面的

$cmd = ".\processFile.ps1" 
$fn = "some File.csv" 
$sb = [ScriptBlock]::Create("$cmd `"$fn`"") # notice the escape $fn parameter 
Invoke-Command -ScriptBlock $sb 

# outputs the correct 
some File.csv 

做,當我嘗試擴展這個空間爲腳本名的支持,一切都分崩離析。下面失敗

$cmd = ".\processFile.ps1" 
$fn = "some File.csv" 
$sb = [ScriptBlock]::Create("`"$cmd`" `"$fn`"") # notice the attempt to escape both parameters 

以下情況例外

Exception calling "Create" with "1" argument(s): "Unexpected token 'some File.csv' in expression or statement." 

一切我都試過了,並且已經有很多很多不同的方法,也造成了類似的東西。我似乎無法讓兩個參數都被轉義。 (實際上,這個問題比我無法逃脫第一個參數。我的一些嘗試已經包括嵌套引號,單引號,[ScriptBlock] :: Create,{},$ executionContext等。

謝謝。

回答

4

試試這個:

$sb = [ScriptBlock]::Create(@" 
&'$cmd' '$fn' 
"@) 
+0

工程。謝謝mjolinor。但你能解釋一下這裏發生了什麼嗎?我知道「&」運算符將字符串視爲命令,但它如何應用於參數的兩組單引號? – Jason 2012-03-29 20:01:06

+1

當你引用它的時候,你必須明確地調用它,否則它只會被視爲一個字符串。這實際上與參數的單引號沒有任何關係 - 那些將參數保存在一起用於命令參數。使用here-string只需消除必須轉義或加倍引號的需要。無論你想要什麼,你都可以放任何你想要的引號。 – mjolinor 2012-03-29 20:17:00

+0

謝謝你的解釋。 – Jason 2012-03-29 21:19:52

4

對於任何令人費解的mjolinor接受的答案,你需要添加:

. $sb

讓它實際運行腳本塊。

此外,這似乎更具可讀性我簡單的語法是:

$cmd = @" 
&'$cmd' '$fn' 
"@ 
Invoke-Expression $cmd 
相關問題