在远程会话上使用Powershell Invoke-Command以按字符串调用可执行文件

时间:2015-08-06 16:05:17

标签: powershell-v3.0 powershell-remoting invoke-command

我想编写一个Powershell脚本,通过其路径调用远程计算机上的可执行文件,然后等待它完成运行。这是我到目前为止所得到的:

$executable = "C:\Temp\example.exe"
$session = New-PSSession -ComputerName VIRTUALMACHINE
$job = Invoke-Command -Session $session -ScriptBlock {$executable} -AsJob
Wait-Job -Job $job

远程机器运行字符串$ executable而不是运行C:\ Temp \ example.exe,而不是我在这里的目的!

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

使用培根比特回答中的一些信息,this回答的信息以及this回答的一些信息,我设法拼凑出一个解决方案。

$executable = "C:\Temp\example.exe"
$session = New-PSSession -ComputerName VIRTUALMACHINE
Invoke-Command -Session $session -ScriptBlock {Start-Process $using:executable -Wait}

我之前使用的脚本块将$executable作为脚本运行,即在远程会话中返回$executable的值,这根本不起作用。这不会获得$executable的本地值,即使它确实存在,也无法运行可执行文件。要获取远程会话的本地值,$using:executable将提供,但仍未执行。现在,使用Start-Process $using:executable将运行可执行文件,&$using:executableInvoke-Expression $using:executable,但它似乎不起作用,因为作业将立即完成。使用Start-Process $using:executable -Wait将实现最初的预期任务,尽管我认为有很多方法可以做到这一点。

我会等待接受这个作为答案,直到其他人有时间提出更好的答案或纠正我在这里给出的任何错误信息。

答案 1 :(得分:1)

您需要调用运算符(&)来执行字符串,就像它是脚本,或Invoke-Expression或Start-Process一样。试试{&$executable}{iex $executable}{Start-Process $executable}

Each one functions slightly different,所以你一定要测试它们。根据我的经验,你必须摆弄他们,让他们做你想做的事情,并按照你想要的方式行事。