【问题标题】:Command Line - Wait for a Process to Finish命令行 - 等待进程完成
【发布时间】:2015-06-13 12:37:22
【问题描述】:

我正在无人参与的脚本中安装一组驱动程序。其中一个驱动程序(英特尔 USB3 驱动程序)在完成后启动 Windows Driver Finder 应用程序(“drvinst.exe”)。然后,当 nVidia 驱动程序尝试运行时,它们会取消,因为该向导仍在后台运行。

我目前的解决方案是这样的,但不是很优雅:

:INSTALLLAPTOP79
.\ELAN\Touchpad\Setup.exe /s /a /s
.\Intel\Chipset\Setup.exe -s -norestart
.\Intel\Graphics\Setup.exe -s
.\Intel\MEI\Setup.exe -s
.\Intel\USB3\Setup.exe -s
.\Realtek\Audio\Setup.exe /s
.\Realtek\CardReader\Setup.exe /s
TIMEOUT 180
.\nVidia\Graphics\Setup.exe -n -s
GOTO :INSTALLLAPTOPWIFI

基本上,如果系统比“正常”慢,它会失败,因为 180 秒是不够的。我可以增加这个值,但这对我来说很乱。

我基本上是在寻找一种方法来“检查”以查看“drvinst.exe”是否仍在运行,如果是,请等待一段时间 - 然后再次检查.

有什么想法吗?

【问题讨论】:

    标签: windows batch-file command-line-interface command-line-arguments


    【解决方案1】:

    不保证可以正常工作(这取决于安装程序如何启动驱动程序查找器)但是:

    start /wait command...
    

    可能会成功。请注意,如果要执行的命令包含空格,并且需要用双引号括起来,则需要:

    start /wait "" "c:\program files\something\..."
    

    否则它将把命令作为命令提示符的标题。

    【讨论】:

    • 谢谢 - 试过了 - 不幸的是安装程序退出并且等待命令忽略了启动的 drvinst.exe。
    【解决方案2】:
    @ECHO OFF
    SETLOCAL
    
    notepad
    
    :waitloop
    
    TASKLIST /fi "imagename eq notepad.exe" >NUL
    IF ERRORLEVEL 1 timeout /t 1 /n&GOTO waitloop
    
    GOTO :EOF
    

    这是一个等待notepad.exe 关闭的简单方法。随心所欲地适应……

    @ECHO OFF
    SETLOCAL
    
    notepad
    
    :waitloop
    
    TASKLIST |find "notepad.exe" >NUL
    IF ERRORLEVEL 1 timeout /t 1 /n&GOTO waitloop
    
    GOTO :EOF
    

    应该也可以

    【讨论】:

    • 好的,所以我运行了TASKLIST |find "drvinst.exe" ECHO %ERRORLEVEL%,Tasklist 命令正确识别了进程,但错误级别显示为 0。有什么想法吗?
    • @Magoo,不确定您使用的是哪个 Windows 版本。在 Windows 10 (1903) 中,第一个代码始终给出错误级别 0,第二个代码给出代码正常工作所需的反向错误级别。我发布了一个答案,该答案在保存为 .BAT 文件时适用于 Windows 10。
    【解决方案3】:

    这适用于我在 Windows 10 (1903) 中。警告:如果您将它用于多次运行的进程,它会等待 all 完成后再继续。

    基于@Magoo 的this answer,这对我不起作用,但让我走上了正轨。

    @ECHO OFF
    
    notepad.exe
    REM For the OP's original problem, put drvinst.exe instead of notepad.exe (here and below)
    
    :waitloop
    TASKLIST |find /I "notepad.exe" >NUL
    IF ERRORLEVEL 1 GOTO endloop
    REM echo Notepad running. Waiting 1 second...
    timeout /t 1 /nobreak>NUL
    goto waitloop
    :endloop
    echo Done!
    

    【讨论】:

      【解决方案4】:

      我不知道这是否是最好的方法,但我知道它 100% 有效 当我需要等待时,我会在脚本中使用 call。

      :INSTALLLAPTOP79
      Call \ELAN\Touchpad\Setup.exe /s /a /s
      Call \Intel\Chipset\Setup.exe -s -norestart
      Call \Intel\Graphics\Setup.exe -s
      Call \Intel\MEI\Setup.exe -s
      Call \Intel\USB3\Setup.exe -s
      Call \Realtek\Audio\Setup.exe /s
      Call \Realtek\CardReader\Setup.exe /s
      Call \nVidia\Graphics\Setup.exe -n -s
      GOTO :INSTALLLAPTOPWIFI
      

      调用将使脚本等待,直到正在运行的 exe 完成。

      不确定 .在 \ 服务之前,但如果出于某种原因,您可能需要它。

      【讨论】:

      • 你的答案是错误的。对于 EXE 文件,使用 CALL 无效。它应该用于批处理文件以避免退出主脚本。要等待 exe 结束,您应该使用start /wait,请参阅@TripeHound 的答案
      • .\Intel\MEI\Setup 中反斜杠前的 . 使用当前工作目录,删除 . 会更改行为以将路径用作绝对路径
      • 它在我的工作,它等待每个 exe 处理但如果我使用启动它不会。 start /wait 确实有效,但 call 也适用于我的脚本,它总是等待。所以你说如果我完全删除呼叫它会起作用吗?
      • CALL 没有等待 exe 结束的逻辑,它也可以在没有 CALL 的情况下工作。如果你使用start/wait选项是必要的,否则它会启动EXE异步
      • 我没有意识到这一点,谢谢。那么当我使用它时,它怎么会等待前任?它只是在它之前不使用任何东西的默认行为吗?如果调用没有效果,那么它和什么都不用一样吗?因为我还没有使用 start /wait 但它确实在等待它们完成。对不起,如果这看起来很愚蠢,但我不是专业人士,如果我不问我不会学习
      猜你喜欢
      • 1970-01-01
      • 2011-10-20
      • 2012-10-16
      • 1970-01-01
      • 2011-09-20
      • 2013-01-19
      • 2016-03-07
      • 1970-01-01
      • 2010-11-06
      相关资源
      最近更新 更多