首页 > 解决方案 > 运行脚本以运行远程 .exe 的问题

问题描述

如果我在计算机上运行以下脚本,它会按预期工作并安装。

Start-Process "C:\Test_Software\TestConfigApp" " -s"

但我需要远程运行它。所以这是我拥有的代码,但它不起作用。$Computer 已定义并且是正确的设备。我究竟做错了什么?我有其他脚本可以远程运行到此设备,因此我知道我可以正确访问它并且没有被阻止。

Invoke-Command -ComputerName $Computer -ScriptBlock {Start-Process "C:\Test_Software\TestConfigApp" " -s"}

标签: powershell

解决方案


Start-Process默认情况下异步启动进程。也就是说,即使启动的进程仍在运行,控制权也会立即返回给 PowerShell。

  • 本地调用中,启动的进程独立于调用进程而存在。

  • 远程调用中,远程会话结束会自动终止通过Start-Process.

由于技术原因存在这种不对称性,并在GitHub 问题 #16001中进行了解释。


这意味着您的C:\Test_Software\TestConfigApp进程很可能永远不会有机会运行完成,因为您的远程会话在Start-Process调用后立即结束。

为确保它确实如此,请添加-WaitStart-Process调用中:

Invoke-Command -ComputerName $Computer -ScriptBlock {
  Start-Process -Wait 'C:\Test_Software\TestConfigApp' '-s'
}

笔记:

  • 远程命令在不可见的窗口站中运行,某些GUI应用程序可能拒绝在其中运行。发生这种情况时,您需要寻找一种可以帮助您进行故障排除的日志记录机制;也许远程机器的事件日志提供了线索。

  • 相比之下,如果C:\Test_Software\TestConfigApp恰好是控制台应用程序,则可以通过直接调用实现相同的效果 - 同步执行(这通常是调用控制台应用程序的正确方法 - 请参阅此答案):

Invoke-Command -ComputerName $Computer -ScriptBlock {
  # Only if the application is a *console* application.
  C:\Test_Software\TestConfigApp -s
}

推荐阅读