批处理逐个处理文件

时间:2015-02-15 00:38:15

标签: 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个文件块的文件。思考2​​种不同的方法,并且都很好。

1。在继续其他4

之后将处理前4个文件

2。或者它将运行最多4" pngwolf.exe"同时的实例(最佳选择)

在我的几次测试中,我开始尝试使用%n后的计数器逻辑%1%2%3%4 ... 但即使在那个阶段,我仍然坚持并且无法创建一个计数器系统。 无需问,确定我是批量编码的新手。但即使是一个优秀的设计师,看起来我需要在批次上学到更多。 谢谢,任何人都会伸出援助之手。希望有一个我能理解和适应的简单解决方案。

所有优惠

2 个答案:

答案 0 :(得分:1)

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

您可以使用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"

答案 1 :(得分:1)

@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 - 几乎可以是任何东西)检查flagfile,如果缺少,则创建它并发送下一个转换,传递所需的文件名和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

非常小的变化:

如果发现nextfilenot defined,则所有参数都已耗尽。查找临时文件“%tempfile%a” - 这没有关联的实例编号,并且被删除了。如果它存在,删除它并显示消息“所有作业已启动” - 仍然会有作业运行,但不会再添加作业,并返回循环。

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

当所有作业完成后,回显all done并暂停以允许阅读该消息。

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