使用CMD和PowerShell静默安装exe文件



我正在尝试安装使用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-Processcmdlet的-Wait开关也等待已启动进程的进程退出[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的行为现在至少在文档中也有简要地提到(强调):等待指定的进程及其后代"

try

$arguments = "/Verysilent"C:updatefile.exe -ArgumentList $arguments

最新更新