8

我想使用 Powershell 来调用远程机器上的批处理文件。这个批处理文件有参数。这是我到目前为止所拥有的:

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

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

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

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

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

有什么想法可以使用 Invoke-Command 调用带有参数的批处理文件吗?

4

2 回答 2

7

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

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

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

Invoke-Command -computername $server {\\fileshare\script.cmd $args} -ArgumentList "FirstArgument"
于 2011-12-17T01:51:09.997 回答
3

参数将作为参数传递给脚本块,而不是直接传递给您的 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)]),这是一个语法错误

于 2011-12-17T01:50:52.113 回答