我有一个特殊要求,我试图从主蝙蝠文件中运行子蝙蝠文件。但是我遇到了很多问题。
Master不等待孩子完成并完成而不等待子文件完成。这意味着我无法将其安排为工作。
当我在主文件中执行并行执行时,它不会进入下一行执行。
我正在为您添加参考代码。
主文件代码: -
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,但是如果这个只有用,那么我可以进入下一个级别。
答案 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)
我想我终于理解了你的问题 - 如果我错了,请纠正我。你想要:
换句话说,您希望JOIN
到此批处理文件启动的正在运行的进程,等待所有这些进程完成,直到它们自己完成。
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