2015-09-28 60 views
0

我有一個簡單的命令,需要通過PowerShell在遠程機器上執行。將外部程序的參數作爲字符串變量傳遞

E:\Programs\GMM\bin\GMMFailoverTool.exe -mssql="Server=SomeServer;Database=GMM01" list 

我在正確使用PowerShell執行它,即使沒有嘗試通過Invoke-Command做到這一點的問題。

$binary = "E:\Programs\GMM\bin\GMMFailoverTool.exe" 
$command = "-mssql=`"Server=SomeServer;Database=gmm01`" list" 

Write-Host BINARY: $binary -ForegroundColor Yellow 
write-Host ARGS: $command -ForegroundColor Yellow 
Write-Host FullCommand: $binary $command -ForegroundColor Yellow 
& $binary $command 

輸出:

BINARY: E:\Programs\GMM\bin\GMMFailoverTool.exe 
ARGS: -mssql="Server=SomeServer;Database=gmm01" list 
FullCommand: E:\Programs\GMM\bin\GMMFailoverTool.exe -mssql="Server=SomeServer;Database=gmm01" list 

和命令的返回是喜歡它一點都沒有得到任何的參數(或那些是不正確的)。

問題是如何正確傳遞這些參數,其中$command已被定義爲它應該?如果我通過手工完成而沒有將它全部用於變量,它就可以工作…

& "E:\Programs\GMM\bin\GMMFailoverTool.exe" -mssql="Server=SomeServer;Database=gmm01" list 

回答

2

傳遞參數作爲數組:

$command = '-mssql="Server=SomeServer;Database=gmm01"', 'list' 
& $binary $command 

另外,我有一些情況下的正確參數傳遞給外部程序的唯一方法是運行具有cmd.exe命令:

$command = '-mssql="Server=SomeServer;Database=gmm01" list' 
cmd /c "$binary $command" 

要遠程運行命令,您需要定義scriptblock內的變量:

Invoke-Command -Computer 'remotehost.example.com' -ScriptBlock { 
    $binary = ... 
    $command = ... 
    & $binary $command 
} 

或(也許更好,如果通過一些其他的功能產生的$command值)通過參數-ArgumentList將它們傳遞到腳本塊:

$binary = ... 
$command = ... 

Invoke-Command -Computer 'remotehost.example.com' -ScriptBlock { 
    & $args[0] $args[1] 
} -ArgumentList $binary, $command 

因爲腳本塊的內容不知道什麼關於你腳本的其餘部分。

+0

嘗試&$ binary - %$命令時,輸出爲GMMFailoverTool.exe:未知選項:$命令,因此它好像試圖直接採用它。數組方法也不會改變任何東西。 – MadBoy

+0

* \ *拍自己\ **對不起,我的錯誤。當然' - %'不會起作用,因爲它應該將所有內容作爲字符串處理。查看更新的答案。 –

+0

它僅適用於Array方法。對於這兩種方法。 CMD和另一個。我只是在代碼的其他部分進行了轉換,其中返回的是Array並將其強制轉換爲字符串。 – MadBoy

相關問題