Windows 批处理以逐个处理文件

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。。。 但即使是在那个阶段,我也步履蹒跚,无法创建一

我有一个批处理文件来压缩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