powershell - 运行脚本以运行远程 .exe 的问题
问题描述
如果我在计算机上运行以下脚本,它会按预期工作并安装。
Start-Process "C:\Test_Software\TestConfigApp" " -s"
但我需要远程运行它。所以这是我拥有的代码,但它不起作用。$Computer 已定义并且是正确的设备。我究竟做错了什么?我有其他脚本可以远程运行到此设备,因此我知道我可以正确访问它并且没有被阻止。
Invoke-Command -ComputerName $Computer -ScriptBlock {Start-Process "C:\Test_Software\TestConfigApp" " -s"}
解决方案
Start-Process
默认情况下异步启动进程。也就是说,即使启动的进程仍在运行,控制权也会立即返回给 PowerShell。
在本地调用中,启动的进程独立于调用进程而存在。
在远程调用中,远程会话结束会自动终止通过
Start-Process
.
由于技术原因存在这种不对称性,并在GitHub 问题 #16001中进行了解释。
这意味着您的C:\Test_Software\TestConfigApp
进程很可能永远不会有机会运行完成,因为您的远程会话在Start-Process
调用后立即结束。
为确保它确实如此,请添加-Wait
到Start-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
}
推荐阅读
- python - 执行pytest时如何获取rootdir参数值
- javascript - 按多个数据属性对 div 进行排序
- javascript - Javascript - .then() 尝试在获取值之前返回值
- javascript - 如何修复徽标保持无响应
- c# - 如何反序列化具有字典作为成员的自定义对象?
- php - 如何运行具有不同标头集的 PHP 文件
- html - How can I get the current route's name in vue.js?
- java - 从大型 csv 创建哈希图时出现 OutOfMemory 错误
- ios - IOS 上未收到 Cordova FCM 通知,而应用程序在后台
- ios - 如何实现这样的集合视图?