批处理文件问题:For循环嵌套If/else实现按文件大小压缩
解决批处理筛选大于25KB JPG文件并压缩的问题
我来帮你搞定这个批处理的问题,你的核心需求是只处理目录里大于25KB的JPG文件,原代码里有几个关键的语法和变量使用错误,咱们一个个修正:
原代码的主要问题
- FOR循环遍历目标错误:你写的
FOR %%G IN (C:\My\Directory)是遍历目录本身,不是目录里的JPG文件,得改成遍历*.jpg文件 - 文件大小变量用错:你尝试的
%var%、%G%都不对,批处理中要获取循环变量对应的文件字节数,必须用%%~zG这个特殊变量 - IF条件语法错误:批处理的数值比较不需要加
[],正确的写法是直接用IF %%~zG GTR %maxbytesize% - ELSE位置错误:批处理要求ELSE必须和IF的结束部分在同一行(或者紧跟IF的命令),不能单独换行
- mogrify命令目标错误:原命令用
*.jpg会处理所有文件,应该指定单个文件"%%G"来只处理符合条件的目标 - 日志逻辑不合理:原代码每个不符合条件的文件都会输出“All files are compressed”,这显然不符合需求,应该改成最后统计是否有文件被处理再输出
修正后的完整代码
@echo off SETLOCAL EnableDelayedExpansion SET maxbytesize=25000 SET logfile=A:\JobLogs\PhotoCompression.log SET "processed=0" :: 写入开始日志 ECHO Starting compression job at %date% %time% >> %logfile% :: 遍历目录下所有JPG文件 FOR %%G IN (C:\My\Directory\*.jpg) DO ( :: 判断文件大小是否大于25KB IF %%~zG GTR %maxbytesize% ( :: 仅压缩当前符合条件的文件 magick mogrify -resize "140^>" -quality 75% -depth 8 -units PixelsPerInch -density 72x72 -strip "%%G" :: 记录处理日志 ECHO %%G has been compressed at %date% %time% >> %logfile% :: 标记有文件被处理 SET "processed=1" ) ) :: 根据是否有文件被处理,写入对应日志 IF %processed% EQU 1 ( ECHO Job completed: Processed files larger than 25KB at %date% %time% >> %logfile% ) ELSE ( ECHO Job completed: All files are already smaller than 25KB at %date% %time% >> %logfile% ) EXIT /B
关键改动解释
- 遍历目标修正:
FOR %%G IN (C:\My\Directory\*.jpg)准确遍历目录下所有JPG文件 - 文件大小判断:
%%~zG获取当前文件的字节数,和%maxbytesize%(25000字节=25KB)做数值比较 - mogrify目标调整:用
"%%G"替代*.jpg,确保只处理当前符合条件的单个文件,避免误处理小文件 - 日志逻辑优化:新增
processed变量,用来标记是否有文件被处理,最后统一输出结果,避免重复的错误日志 - 语法规范:修正IF/ELSE的换行问题,确保批处理能正确解析逻辑
这样修改后,批处理就会只压缩目录中大于25KB的JPG文件,同时日志记录也会更准确。
内容的提问来源于stack exchange,提问作者Cheese
相关产品推荐
相关产品推荐

