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

mur*_*nsk 3 powershell cmd inno-setup docker

我正在尝试安装使用 Inno Setup 创建的 exe。当我尝试使用 PowerShell 安装它时

Start-Process -wait C:\updatefile.exe /VERYSILENT
Run Code Online (Sandbox Code Playgroud)

所有文件夹都创建在正确的位置,创建注册表值,但控制台挂起并且不会返回,除非Ctrl+C按下 。

但是如果我使用命令提示符安装 exe

start /wait C:\updatefile.exe /VERYSILENT
Run Code Online (Sandbox Code Playgroud)

一切正常,命令提示符返回。

造成这种异常现象的原因可能是什么?

我需要通过 Dockerfile 安装此 exe,但由于 PowerShell 安装挂起,容器不会安装 exe。即使使用cmdDockerfile 中的版本,容器也不会创建安装文件夹。


检查日志后我发现exe服务最终由安装程序启动。如果这是挂起的原因,是否有一些参数可以用来退出 PowerShell?

mkl*_*nt0 6

-WaitPowerShell cmdlet 的切换也会Start-Process等待启动进程的进程退出[1],而cmd.exe的内部start命令则不会。

  • 正如您在后面的评论中所指出的,安装程序最后会启动一个服务可执行文件;鉴于服务无限期地运行,Start-Process等待(子)进程终止确实解释了挂起。

这是一个简单的解决方法

cmd /c C:\updatefile.exe /VERYSILENT
Run Code Online (Sandbox Code Playgroud)

当通过 调用可执行文件时cmd /ccmd.exe隐式等待直到可执行文件的进程(并且只有它)终止,即使它是 GUI 应用程序,就像会那样start /wait


鉴于脚注 [1] 中描述的行为,另一种解决方法是使用-PassThruswitch with Start-Process(而不是-Wait) 并将结果通过管道传输到Wait-Process

Start-Process -PassThru C:\updatefile.exe /VERYSILENT | Wait-Process
Run Code Online (Sandbox Code Playgroud)

[1] 请参阅GitHub 问题 #15555,其中还讨论了Wait-Process不同的行为,即仅等待进程本身终止。
正如zett42Start-Process -Wait指出的那样,现在至少在文档中简要提到了的行为(添加了强调):“等待指定的进程及其后代”。