启动过程 - 等待不工作
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