我需要在遠程計算機上運行ps1腳本。腳本將傳遞一個代表文件名的參數。我嘗試了許多不同的組合和方法來將參數傳遞給腳本塊,但當嘗試支持腳本名稱和/或文件名中的空格時,我總是收到一個或另一個錯誤。如何將引用的參數傳遞給PowerShell Invoke-Command和ScripBlocks
注:最終的結果將是一個遠程計算機上使用-ComputerName參數來調用命令,但爲了簡單起見運行腳本和測試所有的例子在本地運行。
給出的樣本 「遠程」 腳本
#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等。
謝謝。
工程。謝謝mjolinor。但你能解釋一下這裏發生了什麼嗎?我知道「&」運算符將字符串視爲命令,但它如何應用於參數的兩組單引號? – Jason 2012-03-29 20:01:06
當你引用它的時候,你必須明確地調用它,否則它只會被視爲一個字符串。這實際上與參數的單引號沒有任何關係 - 那些將參數保存在一起用於命令參數。使用here-string只需消除必須轉義或加倍引號的需要。無論你想要什麼,你都可以放任何你想要的引號。 – mjolinor 2012-03-29 20:17:00
謝謝你的解釋。 – Jason 2012-03-29 21:19:52