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

Batch file 如何从主批处理文件运行多个从属批处理文件?,batch-file,Batch File,我有一个特殊的要求,我试图从主bat文件运行子bat文件。但是我遇到了很多问题 主文件不等待子文件完成,也不等待子文件完成即可完成。这意味着我不能把它安排为工作 当我在主文件中执行并行执行时,它不会进入下一行执行 我正在为您添加一个参考代码 主文件的代码:- start "C:\Test\Parallel_batch_process\chlidA.bat" start "C:\Test\Parallel_batch_process\chlidB.bat" 奇尔达:- start "test1"

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

  • 主文件不等待子文件完成,也不等待子文件完成即可完成。这意味着我不能把它安排为工作

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

  • 我正在为您添加一个参考代码

    主文件的代码:-

    start "C:\Test\Parallel_batch_process\chlidA.bat"
    start "C:\Test\Parallel_batch_process\chlidB.bat"
    
    奇尔达:-

    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^)
    
    儿童B:-

    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^)
    

    还有一个扩展名,我正在从子文件调用孙子,但是如果这个扩展名只起作用,那么我可以进入下一个级别。

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

    REM Child.bat
    ECHO This is the child
    


    我想我终于明白你的问题了——如果我错了,请纠正我。您想:

  • 启动一个批处理文件,该批处理文件启动多个新批处理文件,所有批处理文件同时运行
  • 但是,直到所有启动的批处理文件本身都完成之后,该批处理文件才会完成
  • 换句话说,您希望
    加入该批处理文件启动的正在运行的进程,等待所有进程完成,直到它们自己完成

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

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

    现在我们在谈!但仍然有标题。让我们删除这些:

    tasklist /nh /fo CSV
    
    嗯,好的,但是列出了所有正在运行的进程。我们能有选择性吗?是,通过使用
    if
    子句(拼写为
    fi
    ):

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

    现在我们可以做一些处理了!您可以使用
    find
    -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
    
    …但这有点处理器密集型!您可能应该在两行之间等待一段时间:

    :Wait
    for /f "usebackq" ... (rest of line above)
    if %NUM% EQU 0 goto Exit
    timeout 1 > nul
    goto Wait
    :Exit
    

    不清楚你在问什么。您希望主机等待每个子进程,但您也希望并行运行它们,您不能同时获得这两个子进程。
    start“C:\Test\parallel\u batch\process\chlidA.bat”
    start“C:\Test\parallel\u batch\u process\chlidB.bat”
    “child”在这些情况下拼写错误。感谢它在一定程度上起到了作用,请让我知道问题第一部分的答案。它要求主批处理文件处于活动状态,除非子级完成其处理。这看起来像是顺序执行,在这种情况下如何执行并行执行。那些不是在DOS中运行的,显然它们有并行运行的能力。Windows cmd不可用DOS@L是的,但我说过批处理文件是在DOS中启动的,所以它仍然有许多这样的概念在影响它。没有加入的概念……我想我现在明白你的意思了。你的意思是批处理的历史来自DOS时代,所以它有遗留问题。我想你是说上面的批处理文件是从DOS调用的
    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
    
    :Wait
    for /f "usebackq" ... (rest of line)
    if %NUM% NEQ 0 goto Wait
    
    :Wait
    for /f "usebackq" ... (rest of line above)
    if %NUM% EQU 0 goto Exit
    timeout 1 > nul
    goto Wait
    :Exit