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

Using Powershell Invoke-Command on remote session to invoke executable by string

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

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

而不是 运行 C:\Temp\example.exe,远程机器运行字符串 $executable - 不完全是我想要的!

我该如何解决这个问题?

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

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

使用 Bacon Bits 的回答中的一些信息,this answer, and some information from this 回答中的信息,我设法拼凑出一个解决方案。

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

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

我会等到其他人有时间提出可能更好的答案或更正我在这里给出的任何错误信息后才接受这个答案。