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

标签 docker powershell cmd inno-setup

我正在尝试安装使用 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/

相关文章:

Powershell - 合并 CSV 文件并附加一列

oracle - 如何从命令行调用 ODI 场景并等待其执行

windows - 运行 cmd.exe 时避免显示 Microsoft 版本

docker - Makefile 未在 NFS 上扩展文件 * 通配符

docker - 为什么在host上执行 "ps aux"就能看到docker容器进程?

linux - 如何将STDIN发送到docker进程

docker - 部署Django到App Engine柔性环境-超时错误响应: [4]

powershell - powershell将objectid转换为sid

powershell - 可以并行执行 ForEach-Object 命令

java - 如何从 Windows 命令行永久更新 PATH 变量?