启动过程 - 等待不工作

Posted

技术标签:

【中文标题】启动过程 - 等待不工作【英文标题】:Start-Process -Wait Not Working 【发布时间】:2016-01-29 17:31:35 【问题描述】:

我有调用另一个 .exe 文件的 powershell 脚本。 Start-Process ".\file.exe" -wait

file.exe 是一个带有一些消息的简单窗口,只有一个按钮可以关闭 .exe。

这是主脚本运行的第一行。我想等待并让用户单击关闭以继续执行其余代码。

然而,进程启动了,但主程序并没有等待,而是开始执行剩下的代码。

我还有什么需要做的吗?

【问题讨论】:

你确定file.exe 不只是创建一些子进程然后死掉吗? @PetSerAl 有趣的问题,但似乎Start-Process -Wait 实际上也在等待子进程:gist.github.com/IISResetMe/46692538055e570b4a15 (Start-Process ".\file.exe" -PassThru).WaitForExit() 怎么样? @MathiasR.Jessen 实际上Start-Process 在这方面不太可靠。如果您在 Start-Process 行中添加 |?sleep 1;1,则可以看到。 【参考方案1】:

不确定这是否是您要查找的内容,但您可以使用 NSI 包装器使用 ExecWait "powershell -File .\file.exe" 运行第一个脚本,这样就可以完成工作。

之后运行任何其他脚本,它就会执行您要查找的操作。

【讨论】:

【参考方案2】:

这个建议可能不是最好的方法,但在开始一个过程时就想到了。诀窍是让脚本知道另一个进程正在运行,并且必须传达另一个进程已经完成。一种方法是让 EXE 通过在文件关闭之前写入文件进行通信,脚本不断读取文件,等待 EXE 输入的特定输出。虽然这很脏,所以另一种方法是在 Powershell 中使用 Windows 窗体并在 PowerShell 中调用窗体而不是 EXE(如果需要,我可以详细说明)。我的第三个解决方案可能是最容易实现的,但不是最干净的。在启动 EXE 之前,获取所有进程并将它们存储在一个数组中。然后我会启动 EXE 并再次获取进程,但这一次寻找不在该数组中的进程。这可能是您的 EXE,您可以让脚本在 while 循环中查找并等待该进程停止。示例:

$processes = (Get-Process).Id
Start-Process ".\file.exe"
Start-Sleep -Seconds 1
$exeProc   = (Get-Process).Id | ?$processes -notcontains $_
$running   = (Get-Process | ?$_.Id -match $exeProc).Id
while($running)
    Start-Sleep -Seconds 1
    $running = (Get-Process | ?$_.Id -match $exeProc).Id

【讨论】:

【参考方案3】:

Start-Process 似乎为进程创建了一个新窗口,即使您指定了 -Wait 开关。

之前对我有用的是将 -NoNewWindow 开关添加到 Start-Process

试试

Start-Process ".\file.exe" -NoNewWindow -Wait

【讨论】:

以上是关于启动过程 - 等待不工作的主要内容,如果未能解决你的问题,请参考以下文章

python 用于启动qemu VM的好python脚本,等待15秒,并在启动过程中按活动排序cpu,以确保虚拟线程pi

应用程序进程启动过程

计算机/linux启动过程

基于PXE网络启动的Linux系统自动化安装

如何以可编程方式等待进程启动端点

全面解析Activity: Activity的工作过程