gpt4 book ai didi

windows - 批量处理一个一个的文件

转载 作者:可可西里 更新时间:2023-11-01 10:21:20 25 4
gpt4 key购买 nike

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

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

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

我想我必须解决“%1”部分。我正在尝试批量处理具有 4 个文件 block 的文件。想到了 2 种不同的方法,都很好。

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

2. 或者它将同时运行最多 4 个“pngwolf.exe”实例(最佳选择)

在我的几次测试中,我开始尝试在 %n 之后使用计数器逻辑 %1 %2 %3 %4...但即使在那个阶段,我也卡住了,无法创建一个反制系统。不用问,确定我是批处理编码的新手。但即使要成为一名优秀的设计师,看来我还需要学习更多关于批处理的知识。感谢任何人都会伸出援手。希望有一个我能理解和适应的简单解决方案。

所有最好的

最佳答案

@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”——它没有附加的实例编号,并且被任意删除了。如果存在,则将其删除并显示消息“所有作业已启动”——仍然会有作业在运行,但不会添加更多作业,然后返回循环。

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

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

自然地,如果您在显示的消息中插入一个 control-g 字符,如果您想要一个音频警报,就会发出哔声。

关于windows - 批量处理一个一个的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28521879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com