【问题标题】: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},则可以看到。

标签: powershell exe wait start-process


【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-20
        • 1970-01-01
        • 1970-01-01
        • 2017-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多