Batch file 如何从主批处理文件运行多个从属批处理文件?
我有一个特殊的要求,我试图从主bat文件运行子bat文件。但是我遇到了很多问题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"
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