【问题标题】:Making command prompt wait让命令提示符等待
【发布时间】:2014-12-26 01:50:00
【问题描述】:
@call JBOSSbuildWar.bat > ..\logs\JBOSSbuildWar_out 2> ..\logs\JBOSSbuildWar_err

start cmd /c @call WeblogicbuildWar.bat > ..\logs\WeblogicbuildWar_out 2> ..\logs\WeblogicbuildWar_err

start cmd /c @call FEBAPortletWebWar.bat > ..\logs\FEBAPortletWebWar_out 2> ..\logs\FEBAPortletWebWar_err

start cmd /c @call buildStaticJBoss.bat > ..\logs\JBOSSFEBAStaticWar_out 2> ..\logs\JBOSSFEBAStaticWar_err

我有这组批处理文件按顺序执行。我想分出这个,以便它们并行执行。我已经使用 start cmd /c 完成了。现在这将为它们中的每一个派生出新的命令提示符窗口。假设在此之后有一些语句。我想确保它们仅在所有分叉的批处理文件完成后才被执行。如何做到这一点?

假设每个文件花费的平均时间是: JBOSSbuildWar- 30 分钟 WeblogicbuildWar- 35 分钟 FEBAPortletWebWar- 30 分钟 buildStaticJBoss- 35 分钟

由于主命令提示符窗口在 30 分钟内完成了任务,而分叉的批处理文件还需要 5 分钟才能完成,我希望主 cmd 等到其他完成。请帮忙。

【问题讨论】:

    标签: cmd batch-processing


    【解决方案1】:

    您可以在每个命令之前添加此计时器功能:

    @call JBOSSbuildWar.bat > ..\logs\JBOSSbuildWar_out 2> ..\logs\JBOSSbuildWar_err

    超时 /t 60 /nobreak >nul

    开始 cmd /c @call WeblogicbuildWar.bat > ..\logs\WeblogicbuildWar_out 2> ..\logs\WeblogicbuildWar_err

    超时 /t 60 /nobreak >nul

    start cmd /c @call FEBAPortletWebWar.bat > ..\logs\FEBAPortletWebWar_out 2> ..\logs\FEBAPortletWebWar_err

    超时 /t 60 /nobreak >nul

    start cmd /c @call buildStaticJBoss.bat > ..\logs\JBOSSFEBAStaticWar_out 2> ..\logs\JBOSSFEBAStaticWar_err

    ps:60代表1分钟,如果要30分钟,改成1800

    【讨论】:

      【解决方案2】:

      简单的方法:

      在您的主要批次中,

      del "%temp%\*.processfinished" >nul 2>nul
      ...
      start ....whatever1.bat...
      start ....whatever2.bat...
      start ....whatever3.bat...
      ...
      wait4all:
      for /L %%a in (1,1,3) do if not exist "%temp%\%%a.processfinished" timeout /t 1 >nul &goto wait4all
      :: continues here when all (3) processes have finished.
      del "%temp%\*.processfinished" >nul 2>nul
      

      然后在每个 (3) 个子公司 .bat 文件中,创建一个文件 "%temp%\x.processfinished",其中 x=1 表示第一个进程,2 表示第二个进程,依此类推。

      当子进程启动后,该过程会等待直到每个进程都创建了自己的“.processcompleted”文件,方法是检查这 3 个是否缺少任何一个,如果是,则超时 1 秒并再次查看。只有存在 3 个文件时才会继续。

      如果子流程可以采用额外的参数(该子流程的“流程完成”文件的名称)而不是每个都有一个固定的数字,那将是最好的。

      您可以扩展它,并使用日期和时间来增加文件名,以便整个过程本身可以并行运行多次。

      顺便说一句 - 通过启动程序

      @echo off
      

      您可以删除所有前导 @s(所做的只是抑制该 one 行的命令报告。)

      另外,startstart "" ..... 更快乐,也就是说,用引号中的空窗口标题作为它的第一个参数。这允许根据需要“引用”其他参数 - 使用的第一个“引用”参数用作流程的“窗口标题”,并且可能会丢失给子流程。定期分配一个虚拟(必要时为空)“窗口标题”意味着您将来不会遇到这个问题。

      【讨论】:

        【解决方案3】:

        有多个命令,你可以选择使用哪个,

        暂停

        将暂停 cmd 直到用户按下任意键。 显示消息“按任意键继续...” 我使用此命令的某个变体,称为 pause>nul。 它的作用是暂停 .bat,但不显示消息,你只是得到一个空白屏幕!

        超时

        多种语法,很实用的命令,这个用的蛮多的。 示例代码:超时 10 可以通过按键绕过 将命令的执行暂停 10 秒。 你也可以像这样构造它:TIMEOUT 10 /nobreak 不允许用户按一个键跳过它,他们必须忍受它!

        Ping

        非常好的一个。 语法是这样的:PING 1.1.1.1 -n 1 -w 60000 >NUL 可能是三者中最复杂的。 PING 可用于延迟执行数秒。

        希望我能帮上忙! -洛根

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-10-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-04
          相关资源
          最近更新 更多