我需要在远程计算机上通过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
答案 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的内容对您脚本的其余部分一无所知。