将外部程序的参数作为字符串变量

时间:2015-09-28 10:59:45

标签: powershell parameters

我需要在远程计算机上通过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

1 个答案:

答案 0 :(得分: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将它们传递到scriptblock中:

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

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

因为scriptblock的内容对您脚本的其余部分一无所知。