windows - 批量处理文件一个一个

标签 windows batch-file multiple-instances

我有一个批处理文件来压缩 PNG 文件。当我批量拖放一些文件时,它开始同时处理所有文件。当我尝试使用数百个文件时,它变得毫无用处(当然)

主要部分是这样的(简化)

START "" /W truepng.exe /out "%~n1_out1.png" %1
START "" /W pngwolf.exe --in="%~n1_out1.png" --out="%~n1_out2.png"

我想我必须解决“%1”部分。 我正在尝试批量处理具有 4 个文件 block 的文件。想到了两种不同的方法,都很好。

1. 将处理前 4 个文件,然后继续处理其他 4 个文件

2. 或者它将同时运行最多 4 个“pngwolf.exe”实例(最佳选择)

在我的几次测试中,我在 %n 之后开始尝试使用计数器逻辑 %1 %2 %3 %4... 但即使在那个阶段,我也陷入困境,无法创建一个计数器系统。 不用问,我当然是批量编码的新手。但即使要成为一名优秀的设计师,看起来我也需要在批量方面学习更多。 感谢任何愿意伸出援手的人。希望有一个我可以理解和适应的简单解决方案。

所有最好的

最佳答案

@ECHO OFF
SETLOCAL
SET /a instances=4
:: make a tempfile
:maketemp
SET "tempfile=%temp%\%random%"
IF EXIST "%tempfile%*" (GOTO maketemp) ELSE (ECHO.>"%tempfile%a")
::
:loop
SET "nextfile=%~1"
IF NOT DEFINED nextfile (
 ECHO all done
 DEL "%tempfile%a*" >NUL 2>NUL
 GOTO :eof
)

FOR /L %%a IN (1,1,%instances%) DO (
 IF NOT EXIST "%tempfile%a%%a" (
  >"%tempfile%a%%a" ECHO.
  START "Instance %%a" oneconversion "%~1" "%tempfile%a%%a" %%a
  SHIFT
  GOTO loop
 )
)
timeout /t 1 >NUL
GOTO loop

GOTO :EOF

oneconversion.bat 所在位置

@ECHO OFF
SETLOCAL
START "" /W truepng.exe /out "%~n1_out1.png" %1
START "" /W pngwolf.exe --in="%~n1_out1.png" --out="%~n1_out2.png"
DEL "%~2" >NUL 2>NUL
cls
exit

作为证明原理的假人,我使用了 oneconversion.bat

@ECHO OFF
SETLOCAL
TITLE Processing %~1
SET /a wait=%~3*6
timeout /t %wait%
DEL "%~2" >NUL 2>NUL
CLS
exit

这就是提供第三个参数的原因 - 它只是为了使 oneconversion.bat 可变长度。

操作相当简单:建立一个虚拟临时文件并假设该文件名+一个数字可用作标志文件。

对于每个可用实例(设置为 4 - 几乎可以是任何东西)检查标志文件,如果丢失,则创建它并发送下一个转换,传递所需的文件名和 temfilename。转换完成后,杀死临时文件。


编辑以更具沟通性:

@ECHO OFF
SETLOCAL
SET /a instances=4
:: make a tempfile
:maketemp
SET "tempfile=%temp%\%random%"
IF EXIST "%tempfile%*" (GOTO maketemp) ELSE (ECHO.>"%tempfile%a")
::
:loop
SET "nextfile=%~1"
IF NOT DEFINED nextfile (
 IF EXIST "%tempfile%a" DEL "%tempfile%a"&ECHO All jobs started&GOTO loop
 IF EXIST "%tempfile%a*" GOTO delay
 ECHO all done
 pause
 GOTO :eof
)

FOR /L %%a IN (1,1,%instances%) DO (
 IF NOT EXIST "%tempfile%a%%a" (
  >"%tempfile%a%%a" ECHO.
  START "Instance %%a" oneconversion "%~1" "%tempfile%a%%a" %%a
  SHIFT
  GOTO loop
 )
)
:delay
timeout /t 1 >NUL
GOTO loop

GOTO :EOF

非常小的变化:

当发现nextfile未定义时,则说明所有参数已用完。查找临时文件“%tempfile%a” - 该文件没有附加实例编号并且被任意删除。如果存在,则删除它并显示消息“所有作业已启动” - 仍然会有作业在运行,但不会添加更多作业,然后返回循环。

下次没有找到参数时,“%tempfile%a”将不存在,因此请查看是否存在任何“%tempfile%a*” - 这将表明辅助批处理尚未完成。如果存在这样的文件,请进入delay等待一秒钟,然后重试。

当所有作业完成后,回显全部完成并暂停以允许读取消息。

当然,如果您在显示的消息中插入 control-g 字符,如果您想要音频警报,就会发出蜂鸣声。

关于windows - 批量处理文件一个一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28521879/

相关文章:

.net - 为什么即使在 NetworkStream.EndRead 返回 0 字节后我仍然接收数据?

c++ - 创建 Windows 窗体控件 (C++)

windows - 为什么某些 "for"命令在通过管道输出时不起作用?

postgresql - 在批处理脚本中调用 psql pg_dump 命令

flutter - 带有 GetX 标签的多个实例在 flutter 中不起作用

python - Twisted-PyQt4 段错误

windows - 什么是无窗口控件?

linux - 如何在本地更改子模块远程 url 必须提交这些更改

windows - 如何根据文件夹名称识别最新的应用程序构建文件夹

javascript - 浏览器如何处理同名的多个函数声明?