批量处理一个一个的文件
Batch to process files one by one
我有一个批处理文件来压缩 PNG 文件。当我批量拖放一些文件时,它开始同时处理所有文件。当我尝试使用数百个文件时它变得毫无用处(当然)
主要部分是这样的(简化)
START "" /W truepng.exe /out "%~n1_out1.png" %1
START "" /W pngwolf.exe --in="%~n1_out1.png" --out="%~n1_out2.png"
我想我必须解决“%1”部分。
我正在尝试批量处理具有 4 个文件块的文件。想到了两种不同的方法,都很好。
1. 将处理前4个文件,之后继续其他4个
2. 或者它将 运行 同时最多 4 "pngwolf.exe" 个实例(最佳选择)
在我的几次测试中,我在 %n 之后开始尝试使用计数器逻辑 %1 %2 %3 %4...
但即使在那个阶段,我也卡住了,无法创建一个反制系统。
不用问,确定我是批处理编码的新手。但即使要成为一名优秀的设计师,看来我还需要学习更多关于批处理的知识。
感谢任何人都会伸出援手。希望有一个我能理解和适应的简单解决方案。
所有最佳
包含传递给脚本的所有参数的变量是%*
您可以使用 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"
@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
作为证明原理的假人,我用as 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
为not defined
时,那么所有的参数都已经用完了。寻找临时文件“%tempfile%a”——它没有附加的实例编号,并且被任意删除了。如果存在,则删除它并显示消息 "all jobs started" - 仍然会有作业 运行,但不会添加更多作业,然后返回循环。
下一次找不到参数时,“%tempfile%a”将不存在,因此请查看是否存在任何 "%tempfile%a*"
- 这将表明子批处理尚未完成。如果存在这样的文件,请转到delay
稍等片刻再试。
所有作业完成后,回显 all done
并暂停以允许阅读消息。
当然,如果您在显示的消息中插入一个 control-g 字符,如果您想要一个音频警报,就会发出哔声。
我有一个批处理文件来压缩 PNG 文件。当我批量拖放一些文件时,它开始同时处理所有文件。当我尝试使用数百个文件时它变得毫无用处(当然)
主要部分是这样的(简化)
START "" /W truepng.exe /out "%~n1_out1.png" %1
START "" /W pngwolf.exe --in="%~n1_out1.png" --out="%~n1_out2.png"
我想我必须解决“%1”部分。 我正在尝试批量处理具有 4 个文件块的文件。想到了两种不同的方法,都很好。
1. 将处理前4个文件,之后继续其他4个
2. 或者它将 运行 同时最多 4 "pngwolf.exe" 个实例(最佳选择)
在我的几次测试中,我在 %n 之后开始尝试使用计数器逻辑 %1 %2 %3 %4... 但即使在那个阶段,我也卡住了,无法创建一个反制系统。 不用问,确定我是批处理编码的新手。但即使要成为一名优秀的设计师,看来我还需要学习更多关于批处理的知识。 感谢任何人都会伸出援手。希望有一个我能理解和适应的简单解决方案。
所有最佳
包含传递给脚本的所有参数的变量是%*
您可以使用 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"
@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
作为证明原理的假人,我用as 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
为not defined
时,那么所有的参数都已经用完了。寻找临时文件“%tempfile%a”——它没有附加的实例编号,并且被任意删除了。如果存在,则删除它并显示消息 "all jobs started" - 仍然会有作业 运行,但不会添加更多作业,然后返回循环。
下一次找不到参数时,“%tempfile%a”将不存在,因此请查看是否存在任何 "%tempfile%a*"
- 这将表明子批处理尚未完成。如果存在这样的文件,请转到delay
稍等片刻再试。
所有作业完成后,回显 all done
并暂停以允许阅读消息。
当然,如果您在显示的消息中插入一个 control-g 字符,如果您想要一个音频警报,就会发出哔声。