使用Powershell的Invoke-Command调用带参数的批处理文件

时间:2011-12-17 00:50:39

标签: windows powershell batch-file cmdlets invoke-command

我想使用Powershell来调用远程计算机上的批处理文件。此批处理文件包含参数。这是我到目前为止所做的:

$script = "\\fileshare\script.cmd"
$server = $args[0]
$args [string]::join(',',$args[1 .. ($args.count-1)])

Invoke-Command -computername $server {$script + ' ' + $args}

经过一些搜索,我发现Invoke-Command函数在一个全新的进程中运行它的scriptblock,因此你不能在其中放入变量(它们不会被扩展)。这就是-ArgumentList标签的用途。所以我尝试了这个......

Invoke-Command -computername $server {\\fileshare\script.cmd} -ArgumentList "FirstArgument"

这也不起作用......我的批处理脚本告诉我它没有传递任何参数。我找不到任何明确说明的内容,但看起来-ArgumentList参数只适用于Powershell脚本(它不会将它们提供给批处理脚本)。

如何使用Invoke-Command调用带参数的批处理文件?

2 个答案:

答案 0 :(得分:6)

当您将参数列表传递给scriptblock时,请尝试使用PARAM指令“接收它们”。像这样:

Invoke-Command -computername $server {PARAM($myArg) \\fileshare\script.cmd $myArg} -ArgumentList "FirstArgument"

或者您可以使用$ args自动变量:

Invoke-Command -computername $server {\\fileshare\script.cmd $args} -ArgumentList "FirstArgument"

答案 1 :(得分:3)

参数将作为参数传递给scriptblock,而不是直接传递给cmd。你必须这样做:

Invoke-Command {param($script,$arg1) &$script $arg1 } -computername $server -ArgumentList $script,"FirstArgument"

Invoke-Command {&$args[0] $args[1] } -computername $server -ArgumentList $script,"FirstArgument"

PS:我不知道你在使用$args [string]::join(',',$args[1 .. ($args.count-1)])做了什么,这是一个语法错误