我正在尝试安装使用Inno Setup创建的exe。当我尝试使用PowerShell
安装它时Start-Process -wait C:updatefile.exe /VERYSILENT
所有文件夹都被创建在适当的位置,注册表值被创建,但是控制台挂起并且不返回,除非按下Ctrl+C。
但是如果我使用
命令提示符安装exestart /wait C:updatefile.exe /VERYSILENT
一切正常,命令提示符返回。
这个异常的原因是什么?
我需要这个exe通过Dockerfile安装,但由于PowerShell安装挂起,容器不安装exe。即使Dockerfile中有cmd
版本,容器也不会创建安装文件夹。
检查日志后,我发现exe服务最终由安装程序启动。如果这是挂起的原因,我是否可以使用一些参数来退出PowerShell?
PowerShell的Start-Process
cmdlet的-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