2013-02-20 29 views
5

我正在編寫通用powershell腳本來在遠程機器上執行部署。我已經打一個問題,我不能溢出,而這個問題是由參數列表帶雙引號的參數沒有通過ArgumentList正確傳遞給Scriptblock

傳遞腳本塊雙引號參數我有這樣的事情:

$remoteAddress = "some-pc" 
$deploymentCommand = "D:\some path\Command.exe" 
$deploymentPackages = @(`"「package - one - external"`", `"「package - two - external"`", `"「package - three - internal"`") 

foreach ($deploymentPackage in $deploymentPackages) 
{ 
invoke-command -ComputerName $remoteAddress -ScriptBlock { param ($deployCmd, $deployPackage) & $deployCmd -package:$deployPackage -action:doit } -ArgumentList $deploymentCommand,$deploymentPackage 
} 

我在$ deploymentPackages加雙引號。而我依然讓我的命令remotly執行這樣的(這當然失敗):

D:\some path\Command.exe -package:package - one - external -action:doit 
D:\some path\Command.exe -package:package - two - external -action:doit 
D:\some path\Command.exe -package:package - three - external -action:doit 

而適當的執行路徑應該是:

D:\some path\Command.exe -package:"package - three - external" -action:doit 

周圍沒有包報價 - 一個 - 外部這混亂up everythig

如何超越這個問題,因爲我已經測試過多個解決方案,而且它們都沒有工作。

感謝您的幫助!

回答

5

傳遞給你的可執行文件,這是一樣的做這樣的事情在CMD.EXE -package:"aaa bbb ccc"時,你可以做這樣的事情

$remoteAddress = "some-pc" 
$deploymentCommand = "D:\some path\Command.exe" 
$deploymentPackages = @('package - one - external', 'package - two - external', 'package - three - internal') 
$remoteScript = { 
    param($deployCmd, $deployPackage) 
    & $deployCmd "-package:$deployPackage" -action:doit 
} 

foreach ($deploymentPackage in $deploymentPackages) 
{ 
    invoke-command -ComputerName $remoteAddress -ScriptBlock $remoteScript -ArgumentList $deploymentCommand,$deploymentPackage 
} 

這種捆綁-package:<some string here>成一個參數。

我以爲你不想傳遞給EXE文字的報價,只爲-package:<some string here>是一個參數不管空格<some string here>

如果你想文字引號傳遞exe文件,使用以上代碼

& $deployCmd "-package:`"$deployPackage`"" -action:doit 
+0

該解決方案完美地工作。謝謝! – Midi 2013-02-28 10:02:03

1

嘗試在雙引號的字符串周圍使用單引號。我稍微簡化了腳本,只是寫了字符串而不是運行它。

$remoteAddress = "some-pc"; 
$deploymentPackages = @('"package - one - external"', '"package - two - external"', '"package - three - internal"'); 

foreach ($deploymentPackage in $deploymentPackages) 
{ 
    invoke-command -ComputerName $remoteAddress -ScriptBlock { 
     param ($deploymentPackage) write-host ("-package:{0} -action:doit" -f $deploymentPackage); 
    } -ArgumentList $deploymentPackage; 
} 
8

你可以通過使用單引號來包裝你的字符串來解決這個問題。使用單引號時,引號之間的內容將保持不變(變量不會擴展,像引號一樣會保留)。例如。

PS > '"this is a test"' 
"this is a test" 

因此,要解決你的腳本,嘗試用這個替換您deploymentpackages陣列:

$deploymentPackages = @('"package - one - external"', '"package - two - external"', '"package - three - internal"') 
1

使用"""。例如,

$Var = "One" 

$Var將顯示One

雖然"""$Var"""將顯示One

相關問題