我正在尝试安装使用 Inno Setup 创建的 exe。 当我尝试使用带有
的 PowerShell 安装它时Start-Process -wait C:\updatefile.exe /VERYSILENT
所有文件夹都在适当的位置创建,注册表值已创建,但控制台挂起并且不会返回,除非按下 Ctrl+C。
但是如果我使用命令提示符安装 exe
start /wait C:\updatefile.exe /VERYSILENT
一切正常,命令提示符返回。
导致这种异常的原因是什么?
我需要这个 exe 通过 Dockerfile 安装,但是由于 PowerShell 安装挂起,容器没有安装 exe。即使在 Dockerfile 中使用 cmd
版本,容器也不会创建安装文件夹。
查看日志后发现exe服务最终是由安装程序启动的。如果这是挂起的原因,我可以使用一些参数来退出 PowerShell 吗?
最佳答案
PowerShell Start-Process
的-Wait
开关cmdlet 还等待已启动进程的子 进程退出[1],而cmd.exe
的内部start
命令没有。
- 正如您在后面的评论中指出的那样,服务 可执行文件由您的安装程序在最后启动;鉴于服务无限期运行,
Start-Process
也在等待那个(子)进程终止确实解释了挂起。
这是一个简单的解决方法:
cmd /c C:\updatefile.exe /VERYSILENT
当通过 cmd/c
调用可执行文件时,cmd.exe
会隐式等待直到可执行文件的进程 - 并且只有它 - 终止,即使它是一个 GUI 应用程序,就像 start/wait
一样。
鉴于脚注 [1] 中描述的行为,另一种解决方法是将 -PassThru
开关与 Start-Process
一起使用(而不是 -Wait
) 并将结果通过管道传递给 Wait-Process
:
Start-Process -PassThru C:\updatefile.exe /VERYSILENT | Wait-Process
[1] 参见 GitHub issue #15555 ,其中还讨论了 Wait-Process
行为不同,因为它只等待进程自身终止。
作为zett42指出,Start-Process -Wait
的行为现在至少简要在 docs 中提及以及(添加了重点):“等待指定的进程及其后代”。
关于docker - 使用 CMD 和 PowerShell 静默安装 exe 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74565468/