【问题标题】:Waiting for parallel batch scripts等待并行批处理脚本
【发布时间】:2012-09-16 15:29:22
【问题描述】:

我有 4 个批处理文件。我想同时运行one.battwo.bat。完成这两个批处理文件后,three.batfour.bat 应该同时并行运行。我尝试了很多方法,但 mot 工作正常。

谁能帮我解决这个问题?

【问题讨论】:

    标签: batch-file parallel-processing


    【解决方案1】:

    只是添加另一种方式,也许是最短的。

    (one.cmd | two.cmd) && (three.cmd | four.cmd)
    

    概念真的很简单。并行启动一和二,一旦完成,errorlevel0 运行三和四。

    【讨论】:

      【解决方案2】:

      我也有同样的困境。这是我解决这个问题的方法。 我用Tasklist命令来监控进程是否还在运行:

      :Loop
      tasklist /fi "IMAGENAME eq <AAA>" /fi "Windowtitle eq <BBB>"|findstr /i /C:"<CCC>" >nul && (
      timeout /t 3
      GOTO :Loop
      )
      echo one.bat has stopped
      pause
      

      你需要调整

      &lt;AAA&gt;, &lt;BBB&gt;, &lt;CCC&gt;

      脚本中的值,以便正确过滤您的进程。

      希望对您有所帮助。

      【讨论】:

        【解决方案3】:

        使用我为Parallel execution of shell processes 提供的解决方案的简化版本很容易做到这一点。有关文件锁定如何工作的说明,请参阅该解决方案。

        @echo off
        setlocal
        set "lock=%temp%\wait%random%.lock"
        
        :: Launch one and two asynchronously, with stream 9 redirected to a lock file.
        :: The lock file will remain locked until the script ends.
        start "" cmd /c 9>"%lock%1" one.bat
        start "" cmd /c 9>"%lock%2" two.bat
        
        :Wait for both scripts to finish (wait until lock files are no longer locked)
        1>nul 2>nul ping /n 2 ::1
        for %%N in (1 2) do (
          ( rem
          ) 9>"%lock%%%N" || goto :Wait
        ) 2>nul
        
        ::delete the lock files
        del "%lock%*"
        
        :: Launch three and four asynchronously
        start "" cmd /c three.bat
        start "" cmd /c four.bat
        

        【讨论】:

        • 这非常适合我的需求。谢谢!我还需要确保这些命令成功运行。所以它看起来更像: start "" 9>"%lock%1" CMD /C "one.bat > one-log.txt 2>&1 && echo success > one-success.txt" ... 然后,确保每个 -success.txt 文件都存在,并键入每个 -log.txt 的输出。
        • @macetw 我希望看到您的解决方案在代码块中检查是否成功,以便它可读。您可以编辑上面的答案或提交您的代码块作为答案吗?
        • @LưuVĩnhPhúc - 当然可以,尽管您可能还想加入/nobreak选项。但是,TIMEOUT 不适用于 XP,并且在编写此答案时具有重要的市场份额。值得庆幸的是,现在 XP 不再受支持,它变得越来越不流行了。
        • @phonetagger 那是IPv6 loopback address
        【解决方案4】:

        创建一个启动 one.bat 和 two.bat 的 master.bat 文件。当 one.bat 和 two.bat 正确结束时,它们会回显到它们已完成的文件

        if errorlevel 0 echo ok>c:\temp\OKONE
        if errorlevel 0 echo ok>c:\temp\OKTWO
        

        然后master.bat等待这两个文件的存在

        del c:\temp\OKONE
        del c:\temp\OKTWO
        start one.bat
        start two.bat
        :waitloop
        if not exist c:\temp\OKONE (
            sleep 5
            goto waitloop
            )
        if not exist c:\temp\OKTWO (
            sleep 5
            goto waitloop
            )
        start three.bat
        start four.bat
        

        另一种方法是尝试使用 /WAIT 标志

        start /WAIT one.bat
        start /WAIT two.bat
        

        但您无法控制错误。

        这里有一些参考

        http://malektips.com/xp_dos_0002.html

        http://ss64.com/nt/sleep.html

        http://ss64.com/nt/start.html

        【讨论】:

        • start /WAIT xxx 等待 xxx 完成,然后让执行传递到批处理文件中的下一行。所以one.bat 必须在two.bat 开始之前完成。您可以假设one.bat 将始终先完成并使用start /wait two.bat,但这是一个假设。顺便说一句,您不必start four.bat,您可以只使用call four.bat,(如果在执行four.bat 后没有其他操作,甚至可以省略call)并保存将被使用的内存启动另一个命令处理器。
        • 标记为对在提到 start /WAIT 之前共享的方法有用。还要确保在启动 one.bat 和 two.bat 之前从 master.bat 中删除这些文件。
        • 感谢您的建议,相应地编辑了帖子:-)
        • 正是我需要的。谢谢!
        猜你喜欢
        • 1970-01-01
        • 2017-11-22
        • 1970-01-01
        • 2013-10-10
        • 1970-01-01
        • 2010-10-18
        • 2018-09-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多