提问人:Jos 提问时间:12/11/2015 最后编辑:Jos 更新时间:12/11/2015 访问量:1636
Windows Batch-File 并行执行 n 个其他批处理文件
Windows Batch-File to execute n other batch-files in parallel
问:
我使用 ffmpeg 转换视频文件。我编码的编解码器是单线程的。有很多视频文件需要转换,因此我可以简单地对多个视频文件进行编码,每个视频文件有 1 个线程,而不是使用多线程编码。
为了自动编码,我在 .bat 中使用以下命令:
SET maindir=%~dp0
FOR /r /d %%f in (*) do pushd "%%f" & Call %maindir%convert-with-ffmpeg.bat & popd
这将按顺序调用“convert-with-ffmpeg.bat”来转换主目录中的每个文件/文件夹。
如果我想并行执行此操作(例如,12 次),直到没有更多文件夹需要处理,我的 .bat 文件会是什么样子?
编辑:让我明确一点,我想将正在运行的进程数量限制在 12 个。当 .bat 完成后,我希望主 .bat 启动一个新进程,直到所有文件都转换完毕 (100+)。
答:
0赞
JJF
12/11/2015
#1
使用 start 而不是 call。它不会等待另一个 .bat 文件完成:
SET maindir=%~dp0
FOR /r /d %%f in (*) do pushd "%%f" & start %maindir%convert-with-ffmpeg.bat & popd
评论
0赞
Jos
12/11/2015
我想将正在运行的 .bat 文件的数量限制为 12。当一个完成后,应该启动另一个。
0赞
JackLeEmmerdeur
12/11/2015
#2
我绝不精通批处理编程,但我(在另一种情况下)这样做了(无耻地被盗):
FOR /r /d %%f in (*) do start /b CMD /C "%maindir%\convert-with-ffmpeg.bat %%f"
然后 convert-with-ffmpeg.bat 将包含:
for /f %%f in ('dir /b %1\*.mpeg') do ffmpeg -i "%%f" ...
也许我错了,但我在转换-with-ffmpeg.bat中测试了它:
echo %time:~0,11% Uhr
sleep 2
时间戳几乎相同。
编辑以响应评论(授予不成熟的解决方案)
仅启动指定次数的第二个脚本的替代版本:
SET maindir=%~dp0
SETLOCAL enableextensions enabledelayedexpansion
SET count=0
FOR /r /d %%f in (*) DO (
START /b CMD /C "%maindir%\convert-with-ffmpeg.bat %%f"
SET /a count+=1
IF !count!==12 (GOTO :EOF)
)
也许我在这里偏离了轨道。面对这项任务时,Batch 不会是我的首选。也许可以考虑使用 python 或 java。您会发现它们为并发编程和进程执行提供了大量解决方案。
评论
0赞
Jos
12/11/2015
在这种情况下,这将为每个超过 100 个文件的文件夹启动一个 .bat,并且肯定会引起问题。如何将打开的 .bat 进程数量限制为 12(我拥有的内核数量)?
上一个:关系型数据库中难处理的分层数据
评论