【发布时间】:2012-09-16 15:29:22
【问题描述】:
我有 4 个批处理文件。我想同时运行one.bat 和two.bat。完成这两个批处理文件后,three.bat 和four.bat 应该同时并行运行。我尝试了很多方法,但 mot 工作正常。
谁能帮我解决这个问题?
【问题讨论】:
标签: batch-file parallel-processing
我有 4 个批处理文件。我想同时运行one.bat 和two.bat。完成这两个批处理文件后,three.bat 和four.bat 应该同时并行运行。我尝试了很多方法,但 mot 工作正常。
谁能帮我解决这个问题?
【问题讨论】:
标签: batch-file parallel-processing
只是添加另一种方式,也许是最短的。
(one.cmd | two.cmd) && (three.cmd | four.cmd)
概念真的很简单。并行启动一和二,一旦完成,errorlevel 是 0 运行三和四。
【讨论】:
我也有同样的困境。这是我解决这个问题的方法。 我用Tasklist命令来监控进程是否还在运行:
:Loop
tasklist /fi "IMAGENAME eq <AAA>" /fi "Windowtitle eq <BBB>"|findstr /i /C:"<CCC>" >nul && (
timeout /t 3
GOTO :Loop
)
echo one.bat has stopped
pause
你需要调整
<AAA>, <BBB>, <CCC>
脚本中的值,以便正确过滤您的进程。
希望对您有所帮助。
【讨论】:
使用我为Parallel execution of shell processes 提供的解决方案的简化版本很容易做到这一点。有关文件锁定如何工作的说明,请参阅该解决方案。
@echo off
setlocal
set "lock=%temp%\wait%random%.lock"
:: Launch one and two asynchronously, with stream 9 redirected to a lock file.
:: The lock file will remain locked until the script ends.
start "" cmd /c 9>"%lock%1" one.bat
start "" cmd /c 9>"%lock%2" two.bat
:Wait for both scripts to finish (wait until lock files are no longer locked)
1>nul 2>nul ping /n 2 ::1
for %%N in (1 2) do (
( rem
) 9>"%lock%%%N" || goto :Wait
) 2>nul
::delete the lock files
del "%lock%*"
:: Launch three and four asynchronously
start "" cmd /c three.bat
start "" cmd /c four.bat
【讨论】:
/nobreak选项。但是,TIMEOUT 不适用于 XP,并且在编写此答案时具有重要的市场份额。值得庆幸的是,现在 XP 不再受支持,它变得越来越不流行了。
创建一个启动 one.bat 和 two.bat 的 master.bat 文件。当 one.bat 和 two.bat 正确结束时,它们会回显到它们已完成的文件
if errorlevel 0 echo ok>c:\temp\OKONE
if errorlevel 0 echo ok>c:\temp\OKTWO
然后master.bat等待这两个文件的存在
del c:\temp\OKONE
del c:\temp\OKTWO
start one.bat
start two.bat
:waitloop
if not exist c:\temp\OKONE (
sleep 5
goto waitloop
)
if not exist c:\temp\OKTWO (
sleep 5
goto waitloop
)
start three.bat
start four.bat
另一种方法是尝试使用 /WAIT 标志
start /WAIT one.bat
start /WAIT two.bat
但您无法控制错误。
这里有一些参考
【讨论】:
start /WAIT xxx 等待 xxx 完成,然后让执行传递到批处理文件中的下一行。所以one.bat 必须在two.bat 开始之前完成。您可以假设one.bat 将始终先完成并使用start /wait two.bat,但这是一个假设。顺便说一句,您不必start four.bat,您可以只使用call four.bat,(如果在执行four.bat 后没有其他操作,甚至可以省略call)并保存将被使用的内存启动另一个命令处理器。