运行 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增加到51030秒以减少检查下载任务的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,依此类推的主要内容,如果未能解决你的问题,请参考以下文章

dos下执行bat文件,如何让两个命令之间自动延迟3秒后再继续执行?

如何写BAT 修改指定文件内容,并保存

cmd下执行bat文件的命令

bat文件,在linux平台下,怎么运行

请问一下,如何把bat的文件改为exe形式的文件?

Linux 暂停命令