我有一个主批处理文件,它调用多个批处理文件。我希望能够同时执行所有这些批处理文件。一旦完成,我有进一步的过程需要在主匹配文件中进行。
当我使用'开始'调用多个批处理文件,能够同时启动所有批处理文件,但我失去了跟踪它们。 (主批处理文件认为它们的进程在执行其他批处理文件的那一刻就完成了。)
当我使用' Call'时,能够监控批处理文件过程,但它会顺序启动批处理文件而不是同时启动批处理文件。
有解决方法吗?在此PC上拥有有限的权限,并尝试仅使用Batch完成此操作。
主批处理文件
call first.bat
call second.bat
call third.bat
:: echo only after all batch process done
echo done!
first.bat
timeout /t 10
second.bat
timeout /t 10
third.bat
timeout /t 10
答案 0 :(得分:4)
这是解决此问题的最简单,最有效的方法:
(
start first.bat
start second.bat
start third.bat
) | pause
echo done!
在此方法中,主文件中的等待状态为事件驱动,因此不消耗任何CPU时间。当pause
中的任何一个命令输出一个字符时,( block )
命令将终止,但start
命令不会在此cmd.exe中显示任何输出 。通过这种方式,pause
一直等待char,直到start
命令启动的所有进程结束。此时,与( block )
关联的管道线将关闭,因此pause
Stdin将关闭,命令将由cmd.exe
终止。
答案 1 :(得分:1)
这将生成一个临时文件,并通过创建一个重定向来锁定它,启动此重定向中的批处理子进程。当所有子进程结束时,关闭重定向并删除临时文件。
当子进程正在运行时,文件被锁定,我们可以测试这个尝试重命名文件。如果我们可以重命名文件,则子进程已经结束,否则某些进程仍在运行。
@echo off
setlocal enableextensions disabledelayedexpansion
for %%t in ("%temp%\%~nx0.%random%%random%%random%.tmp") do (
echo Starting subprocesses
9> "%%~ft" (
start "" cmd /c subprocess.bat
start "" cmd /c subprocess.bat
start "" cmd /c subprocess.bat
start "" cmd /c subprocess.bat
start "" cmd /c subprocess.bat
)
echo Waiting for subprocesses to end
break | >nul 2>nul (
for /l %%a in (0) do @(ren "%%~ft" "%%~nxt" && exit || ping -n 2 "")
)
echo Done
) & del "%%~ft"
注意:在子进程内启动的任何进程也将保留重定向和锁定。如果您的代码正在运行,则无法使用。
答案 2 :(得分:0)
@ECHO Off
SETLOCAL
:: set batchnames to run
SET "batches=first second third"
:: make a tempdir
:maketemp
SET /a tempnum=%random%
SET "tempdir=%temp%\%tempnum%"
IF EXIST "%tempdir%*" (GOTO maketemp) ELSE (MD "%tempdir%")
FOR %%a IN (%batches%) DO START "%%a" %%a "%tempdir%\%%a"
:wait
timeout /t 1 >nul
FOR %%a IN (%batches%) DO IF exist "%tempdir%\%%a" GOTO wait
RD "%tempdir%" /S /Q
GOTO :EOF
批次的构造类似于
@ECHO OFF
:: just delay for 5..14 seconds after creating a file "%1", then delete it and exit
SETLOCAL
ECHO.>"%~1"
SET /a timeout=5+(%RANDOM% %% 10)
timeout /t %timeout% >NUL
DEL /F /Q "%~1"
EXIT
也就是说,每个被调用的批处理首先在临时目录中创建一个文件,然后在运行所需的进程后删除它。要创建/删除的文件名作为批处理的第一个参数提供,并引用"引用"因为temp
目录名通常包含分隔符。
主线只是创建一个临时目录并调用子过程,然后重复等待1秒钟并检查子过程是否过时。 flagfile已全部删除。只有在使用该过程删除了所有内容后,才会继续删除临时目录
答案 3 :(得分:0)
通过Aacini添加到答案。我也在寻找类似的任务。目的是并行运行多个命令并提取所有并行进程的输出(stdout和错误)。然后等待所有并行进程完成并执行另一个命令。以下是BAT文件的示例代码,可以在CMD中执行:
(
start "" /B cmd /c ping localhost -n 6 ^>nul
timeout /t 5 /nobreak
start "" /B /D "C:\users\username\Desktop" cmd /c dir ^> dr.txt ^2^>^&^1
start "" /B cmd /c ping localhost -n 11 ^>nul
timeout /t 10 /nobreak
) | pause
Echo waited
timeout /t 12 /nobreak
()
中的所有语句都将首先执行,等待它们完成,然后再执行最后两行。所有以start
开头的命令都将同时执行。