批量处理文件一个接一个

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

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

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

我想我必须解决“%1”部分。 我正在尝试使用4个文件块来batch file。 思考2​​个不同的问题,都罚款。

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

2.或者它会同时运行最多4个“pngwolf.exe”实例(最好的选项)

在我的几个testing中,我在%n之后开始尝试使用一个计数器逻辑%1%2%3%4 …但即使在这个阶段,我也陷入困境,无法创build一个计数器系统。 不需要问,确定我是批处理编码的新手。 但即使是一个好的devise师,看起来像我需要批量学习更多。 感谢任何人都会伸出援手。 希望有一个简单的解决scheme,我可以理解和适应。

所有最好的

Solutions Collecting From Web of "批量处理文件一个接一个"

 @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 

作为证明原理的一个虚拟的,我用作一个转换

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

这就是为什么提供了第三个参数 – 它只是在那里使oneconversion.bat变长。

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

对于每个可用的实例(设置为4 – 可以是几乎任何事情)检查flagfile,如果缺少,创建它并发送下一个转换,传递所需的文件名和temfilename。 转换完成后,关闭tempfile。


编辑更具沟通性:

 @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被发现not defined ,那么所有的参数已经用尽。 寻找临时文件“%tempfile%a” – 这没有affxed实例编号,并正在被删除。 如果存在,删除它并显示消息“所有作业开始” – 仍然有作业正在运行,但不会再添加,然后返回到循环。

下一次没有找到参数时,“%tempfile%a”将不存在,所以查看是否存在"%tempfile%a*" – 这将指示辅助批处理未完成。 如果这样的文件存在, delay等待一秒钟,然后再试一次。

当所有的工作完成后,回应all done并暂停,以允许读取消息。

当然,如果你在显示的信息中插入一个控制字符,如果你想要一个音频警报,会发出一声嘟嘟的响声。

包含传递给脚本的所有参数的变量是%*

您可以使用for循环一次处理一个:

 for %%A in (%*) do ( START "" /W truepng.exe /out "%%~nA_out1.png" %%%A START "" /W pngwolf.exe --in="%%~nA_out1.png" --out="%%~nA_out2.png" ) 


要同时处理四个批处理,首先运行所有四个truepng实例,然后运行pngwolf的所有四个实例。

 :: Process four sets of truepng at once start "" truepng.exe /out "%~n1_out1.png" %1 start "" truepng.exe /out "%~n2_out1.png" %2 start "" truepng.exe /out "%~n3_out1.png" %3 start "" truepng.exe /out "%~n4_out1.png" %4 :: Wait for 1 second/let the above commands catch up ping -n 1 1.1.1.1>nul :: Process four sets of pngwolf at once start "" pngwolf.exe --in="%~1_out1.png" --out="%~n1_out2.png" start "" pngwolf.exe --in="%~2_out1.png" --out="%~n2_out2.png" start "" pngwolf.exe --in="%~3_out1.png" --out="%~n3_out2.png" start "" pngwolf.exe --in="%~4_out1.png" --out="%~n4_out2.png"