Windows 批处理以逐个处理文件
我有一个批处理文件来压缩PNG文件。当我在批处理中拖放一些文件时,它会同时处理所有文件。当我尝试使用数百个文件时,它变得毫无用处(当然) 主要部分是这样的(简化) 我想我必须解决“%1”部分。 我正在尝试批处理带有4个文件块的文件。考虑两种不同的方法,都很好 1。将处理前4个文件,然后继续处理其他4个文件 2。否则它将同时运行最多4个“pngwolf.exe”实例(最佳选项) 在我的几个测试中,我开始尝试在%n之后使用计数器逻辑%1%2%3%4。。。 但即使是在那个阶段,我也步履蹒跚,无法创建一个计数器系统。 不用问,我是批处理编码的新手。但即使是要成为一名优秀的设计师,看起来我也需要在批处理方面学习更多。 谢谢所有愿意帮忙的人。希望有一个简单的解决方案,我可以理解和适应Windows 批处理以逐个处理文件,windows,batch-file,multiple-instances,Windows,Batch File,Multiple Instances,我有一个批处理文件来压缩PNG文件。当我在批处理中拖放一些文件时,它会同时处理所有文件。当我尝试使用数百个文件时,它变得毫无用处(当然) 主要部分是这样的(简化) 我想我必须解决“%1”部分。 我正在尝试批处理带有4个文件块的文件。考虑两种不同的方法,都很好 1。将处理前4个文件,然后继续处理其他4个文件 2。否则它将同时运行最多4个“pngwolf.exe”实例(最佳选项) 在我的几个测试中,我开始尝试在%n之后使用计数器逻辑%1%2%3%4。。。 但即使是在那个阶段,我也步履蹒跚,无法创建一
All BEST包含传递到脚本中的所有参数的变量是
%*
您可以使用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关闭
SETLOCAL
SET/a实例=4
::制作一个临时文件
:maketemp
设置“tempfile=%temp%\%random%”
如果存在“%tempfile%*”(转到maketemp)ELSE(ECHO.>%tempfile%a)
::
:循环
设置“下一个文件=%~1”
如果未定义nextfile(
回音全部完成
删除“%tempfile%a*”>NUL 2>NUL
后藤:eof
)
对于(1,1,%instances%)中的/L%%a,请执行以下操作(
如果不存在“%tempfile%a%%a”(
>%tempfile%a%%a“回显。
启动“实例%%a“oneconversion”%~1”“%tempfile%a%%a”%%a
移位
转到环路
)
)
超时/t1>num
转到环路
后藤:EOF
其中oneconversion.bat为
@ECHO关闭
SETLOCAL
启动“/W truepng.exe/out”%~n1\u out1.png“%1”
启动“/W pngwolf.exe--in=“%~n1_-out1.png”--out=“%~n1_-out2.png”
删除“%~2”>NUL 2>NUL
cls
出口
为了证明这个原理,我使用了Asoneconversion.bat
@ECHO关闭
SETLOCAL
标题处理%1
设置/a等待=%~3*6
超时/t%等待%
删除“%~2”>NUL 2>NUL
CLS
出口
这就是为什么要提供第三个参数——它只是用来进行oneconversion.bat
可变长度
操作相当简单:建立一个虚拟临时文件,并假设filename+一个数字可用作标志文件
对于每个可用实例(设置为4-可以是任何内容),检查flagfile,如果缺少,则创建它并发送下一次转换,传递所需的文件名和temfilename。转换完成后,删除临时文件
编辑以更具沟通性: 非常小的变化: 当发现
nextfile
未定义时,则所有参数都已用尽。查找tempfile“%tempfile%a”-它没有固定的实例号,正在被任意删除。如果它存在,删除它并显示消息“所有作业已启动”-仍有作业在运行,但不会添加更多作业,然后返回循环
下次找不到任何参数时,“%tempfile%a”将不存在,因此请查看是否存在任何%tempfile%a*”
,这将指示子批次未完成。如果存在这样的文件,请转到delay
等待一秒钟,然后重试
所有作业完成后,回显全部完成
并暂停以允许读取消息
当然,如果您在显示的消息中插入control-g字符,如果您需要音频警报,将会发出嘟嘟声。谢谢,我会尝试。但是有没有办法修改它以处理具有4个实例的文件?一个接一个会非常慢。如果删除/W
标志,您可以使用%1、%2、%3和%4调用truepng和pngwolf,它们将同时运行。很抱歉,由于pngwolf正在使用truepng的输出,因此无法运行。当我从pngwolf中删除时,“几乎”没有发生预期的变化。不过还是要谢谢你。@inovasyon-我添加了代码来同时处理多个输入。我想你误解了。我在“数百个文件”中提到的问题。这就是为什么我需要一个批处理脚本。不仅仅是4。另一个问题是truepng的处理时间从几秒到几分钟不等。我无法定义固定的延迟。但再次感谢您的帮助。原则证明了!第一次尝试效果很好。我对真实代码(不简化)和备份机制等进行了过度编辑。这是一种PNG压缩方法,我做了大约2000次测试,以平衡性能和效率。我会在改编后分享。批处理文件是最后一块。谢谢。嗨;如果可能的话,我想再问一个问题。脚本工程“透视”我只是想添加一个结束信息和声音。我试图在主脚本中找到一个终点,但我找不到。我不知怎么搞糊涂了。我在哪里可以放置一个命令以在最后执行?我试图对代码进行修改,但未能成功。希望你能看到这篇文章。
:: 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 (
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