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

3

我正在尝试安装一个使用Inno Setup创建的exe文件。

当我尝试使用PowerShell进行安装时:

Start-Process -wait C:\updatefile.exe /VERYSILENT

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

但如果我使用命令提示符安装exe文件,则...

start /wait C:\updatefile.exe /VERYSILENT

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

这种异常的原因可能是什么?

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


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

2个回答

6

PowerShell的Start-Process命令的-Wait开关还等待启动进程的进程退出[1],而cmd.exe的内部start命令却不会等待。

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

这里是一个简单的解决方法

cmd /c C:\updatefile.exe /VERYSILENT

当通过cmd /c调用可执行文件时,cmd.exe会隐式等待可执行文件的进程终止,即使它是一个GUI应用程序,就像start /wait一样。请保留HTML标签。

考虑到脚注[1]中描述的行为,另一种解决方法是使用-PassThru开关替换-Wait,并将结果通过管道传递给Wait-Process

Start-Process -PassThru C:\updatefile.exe /VERYSILENT | Wait-Process

[1] 请参阅GitHub 问题 #15555,该问题还讨论了Wait-Process的行为不同之处在于仅等待进程本身终止。
正如zett42所指出的那样,Start-Process -Wait的行为现在至少在文档中也被简要地提到(重点添加):“等待指定进程及其后代”。


-2

尝试

$arguments = "/Verysilent" Start-Process -wait C:\updatefile.exe -ArgumentList $arguments


1
这实际上与 Start-Process -wait C:\updatefile.exe /VERYSILENT 相同,因此不能指望它会有所不同。 - mklement0
1
除此之外,让我建议您正确格式化您的帖子 - mklement0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接