如何从主批处理文件中运行多个从属批处理文件?

时间:2016-08-16 08:47:30

标签: batch-file

我有一个特殊要求,我试图从主蝙蝠文件中运行子蝙蝠文件。但是我遇到了很多问题。

  1. Master不等待孩子完成并完成而不等待子文件完成。这意味着我无法将其安排为工作。

  2. 当我在主文件中执行并行执行时,它不会进入下一行执行。

  3. 我正在为您添加参考代码。

    主文件代码: -

    start "C:\Test\Parallel_batch_process\chlidA.bat"
    start "C:\Test\Parallel_batch_process\chlidB.bat"
    

    ChildA: -

    start "test1" cmd.exe /C ^(ping server1 -n 2 ^> C:\Test\Parallel_batch_process\Test1.txt^) 
    start "test2" cmd.exe /C ^(ping server2 -n 2 ^> C:\Test\Parallel_batch_process\Test2.txt^)
    

    ChildB: -

    start "test1" cmd.exe /C ^(ping Server3 -n 5 ^> C:\Test\Parallel_batch_process\Test3.txt^)
    start "test2" cmd.exe /C ^(ping Server4 -n 2 ^> C:\Test\Parallel_batch_process\Test4.txt^)
    

    还有一个扩展名,我从Child文件中调用GrandChild,但是如果这个只有用,那么我可以进入下一个级别。

2 个答案:

答案 0 :(得分:0)

如果要从另一个文件中执行批处理文件,则应使用CALL命令:

REM Child.bat
ECHO This is the child

REM Master.bat
ECHO This is the master
CALL Child.bat
CALL Child.bat

答案 1 :(得分:0)

我想我终于理解了你的问题 - 如果我错了,请纠正我。你想要:

  1. 启动批处理文件,启动许多新的批处理文件,所有这些文件都同时运行;
  2. 然而,在所有已启动的批处理文件都已完成之前,此批处理文件尚未完成。
  3. 换句话说,您希望JOIN到此批处理文件启动的正在运行的进程,等待所有这些进程完成,直到它们自己完成。

    是的,你不能这样做。不幸的是,DOS(批处理文件启动的地方!)没有并行执行的概念。因此,您需要做的是独立启动每个进程,然后使用tasklist命令查明它们是否仍在运行(自Windows XP以来)。

    tasklist
    

    这将以漂亮的格式输出数据,适合显示 - 但不能用于处理!让我们通过选择逗号分隔值(CSV)版本来更改格式:

    tasklist /fo CSV
    

    现在我们正在谈论!但仍有标题。让我们删除那些:

    tasklist /nh /fo CSV
    

    嗯。好的,但 ALL 列出了正在运行的进程。我们可以有选择性吗?是的,使用if子句(拼写为fi):

    tasklist /nh /fo CSV /fi "imagename eq cmd.exe"
    
      

    if测试检查正在运行的程序的名称。你还没有告诉我们,所以我用cmd.exe - 一个坏主意! (我假设您可以运行自己的shell?)请注意,有许多属性 - 如果有帮助,请尝试windowname ...

    现在我们可以做一些处理了!您可以使用find的{​​{1}}选项找出正在运行的数量:

    -c

    但这对处理没有多大帮助。所以:

    tasklist /nh /fo CSV /fi "imagename eq cmd.exe" | find /c "cmd"
    
      

    不要忘记:在命令行中,for /f "usebackq" %%F in (`tasklist /nh /fo CSV /fi "imagename eq cmd.exe" ^| find /c "cmd"`) do set NUM=%%F 使用一个for。在批处理文件中,您需要其中两个:%
      另外:使用转义字符%%表示特殊的shell字符......

    现在您已获得^变量中运行的进程数:

    NUM

    ...但这有点处理器!你可能应该在两行之间等一会儿:

    :Wait
    for /f "usebackq" ... (rest of line)
    if %NUM% NEQ 0 goto Wait