运行 x5 .bat 文件,暂停,然后运行下一个 5,依此类推
Posted
技术标签:
【中文标题】运行 x5 .bat 文件,暂停,然后运行下一个 5,依此类推【英文标题】:Run x5 .bat file, pause, then run next 5 and so on 【发布时间】:2020-09-20 12:16:13 【问题描述】:背景: 操作系统:win10。单个根文件夹:“U:\11Web\gallery-dl”。
在根目录中,我有 1400 多个子文件夹(这些子文件夹下面没有子文件夹(永远不会有))。 (根目录中也没有单独的/无关的文件(永远不会)。
每个子文件夹都有自己的 .bat 文件,aGallery-dl.bat。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
pushd "%~dp0" || exit /B
move /Y "Folder2.jpg" "Folder.jpg"
for %%I in (.) do set "FOLDER=%%~nxI"
"%ProgramFiles(x86)%\gallery-dl\gallery-dl.exe" -d "U:\11Web\gallery-dl" --download-archive "%~dp0zzzGDB.sqlite3" "https://www.deviantart.com/%FOLDER%/gallery/all"
if not errorlevel 1 if exist "zzzGDB.sqlite3" del "Folder.jpg"
popd
endlocal
我通常手动运行 aGallery-dl.bat;打开下一个文件夹,双击运行;下一个文件夹运行等,直到我在 5 到 10 个 cmd 窗口之间运行。稍后当它们全部完成时,我可能会再浏览 5-10 个文件夹,就这样。在执行每个 aGallery-dl.bat 时,会下载请求的文件,完成后,会对 Folder.jpg 进行一些清理,然后关闭每个 cmd 窗口。
问题:希望稍微自动化这些运行。想要根文件夹中的单个批处理文件,运行时会
创建/更新所有子文件夹的 list.txt/database 文件。一个列表可以在这里工作,像 dir/l>list.txt 这样简单但不知道如何保存计数?
在列表的前 5 个子文件夹中运行 aGallery-dl.bat,暂停 15 分钟(超时?),循环然后点击接下来的 5 个文件夹,依此类推,直到 1400 + 完成了......如果我必须重新启动,或者一周后回来并且必须重新运行同一个批处理文件,它会从第一个文件夹重新开始......没关系......有一个每个文件夹中的 .sqlite3 数据库文件,其中保留了所有以前下载的文件信息。每次从第一个文件夹开始将是一项功能,只下载那些已更新的文件。
我没有起始代码/示例,因为我无法充分理解它以真正开始。
提前致谢。
【问题讨论】:
【参考方案1】:我稍微调整了我的链接代码以适应您的环境。 (未经测试,所以使用副本或备份)
@ECHO off
setlocal
set bunch=10
for /D %%I in ("G:\tmp\*") do (
call :loop
echo processing: %%a
start "MyCommand" cmd /c "%%I\zzzGallery-dl.bat"
)
call :loop
goto :eof
:loop REM waits for available slot
for /f %%x in ('tasklist /fi "windowtitle eq MyCommand" ^| find /c "cmd.exe"') do set x=%%x
if %x% geq %bunch% goto :loop
goto :eof
%bunch%
是并行运行的线程数。您必须进行一些实验才能获得最佳数字。这取决于每个线程产生多少负载以及您的计算机的规格。
【讨论】:
非常感谢斯蒂芬!这很好用!!!哟大男人!! ;) 辛苦了!!【参考方案2】:以下批处理文件可用于运行最多五个aGallery-dl.bat
并行。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /D %%I in ("U:\11Web\gallery-dl\*") do if exist "%%I\aGallery-dl.bat" (
start "Gallery Download %%~nxI" /MIN %ComSpec% /c "%%I\aGallery-dl.bat"
call :CheckDownloads
)
goto :EOF
:CheckDownloads
%SystemRoot%\System32\timeout.exe /T 1 >nul
for /F "delims=" %%J in ('%SystemRoot%\System32\tasklist.exe /FI "IMAGENAME eq cmd.exe" /NH /V ^| %SystemRoot%\System32\find.exe /C "Gallery Download "') do if %%J GEQ 5 goto CheckDownloads
goto :EOF
子例程 CheckDownloads
在启动另一个命令进程后调用,该命令进程运行一个最小化窗口,该命令进程与正在处理此批处理文件以执行 aGallery-dl.bat
的命令进程并行,窗口标题为 Gallery Download
和文件夹附加名称。
子例程等待一秒钟,然后在后台再运行一个命令进程以运行 TASKLIST 以获取正在运行的 cmd.exe
进程列表,该列表使用 FIND 过滤只是那些在窗口标题中带有Gallery Download
的命令进程。
FIND 仅输出带有搜索字符串的行数,即当前运行以进行图库下载的命令进程数。如果此数字(大于或)等于 5,则子例程会再次等待一秒钟,然后再执行此下载任务检查。
稍作修改的版本是:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /D %%I in ("U:\11Web\gallery-dl\*") do if exist "%%I\aGallery-dl.bat" if exist "%%I\Folder.jpg" (
start "Gallery Download %%~nxI" /MIN %ComSpec% /c "%%I\aGallery-dl.bat"
call :CheckDownloads
)
goto :EOF
:CheckDownloads
%SystemRoot%\System32\timeout.exe /T 1 >nul
for /F "delims=" %%J in ('%SystemRoot%\System32\tasklist.exe /FI "IMAGENAME eq cmd.exe" /NH /V ^| %SystemRoot%\System32\find.exe /C "Gallery Download "') do if %%J GEQ 5 goto CheckDownloads
goto :EOF
另外检查文件Folder.jpg
是否存在于子文件夹中,以省略过去已经完成一次图库下载的所有子文件夹,因此文件Folder.jpg
不再存在于子文件夹中。
超时值可以从1
增加到5
或10
或30
秒以减少检查下载任务的CPU使用率。
不应同时启动太多库下载,因为这可能会适得其反,具体取决于 CPU 内核和下载带宽。
此处发布的批处理文件已经完成,最后四个库下载仍在并行运行。
要了解所使用的命令及其工作原理,请打开command prompt 窗口,在那里执行以下命令,并仔细阅读每个命令显示的所有帮助页面。
call /?
echo /?
find /?
for /?
goto /?
if /?
setlocal /?
start /?
tasklist /?
timeout /?
【讨论】:
再次感谢莫菲!! supercalifragilisticexpialidocious(查一下!)太棒了!谢谢!!!【参考方案3】:有时它就在我面前...一次只工作一个文件夹,但工作正常。 1400 多个文件夹之后我应该会很好...感谢您的帮助斯蒂芬!!
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /D %%I in ("G:\tmp\*") do ("%%I\zzzGallery-dl.bat"
endlocal
更新:尽管希望它一次可以并行运行 5-10 个。坐在这里看它一次在一个连续的文件夹中执行这些操作,即使在第一次运行之后,即使只是为了更新,也需要几天时间才能完成 1400 多个。
任何能够在这方面提供帮助的人都会非常感激不尽。
【讨论】:
以上是关于运行 x5 .bat 文件,暂停,然后运行下一个 5,依此类推的主要内容,如果未能解决你的问题,请参考以下文章