You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批处理文件问题: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

关键改动解释

  1. 遍历目标修正:FOR %%G IN (C:\My\Directory\*.jpg) 准确遍历目录下所有JPG文件
  2. 文件大小判断:%%~zG 获取当前文件的字节数,和%maxbytesize%(25000字节=25KB)做数值比较
  3. mogrify目标调整:用"%%G"替代*.jpg,确保只处理当前符合条件的单个文件,避免误处理小文件
  4. 日志逻辑优化:新增processed变量,用来标记是否有文件被处理,最后统一输出结果,避免重复的错误日志
  5. 语法规范:修正IF/ELSE的换行问题,确保批处理能正确解析逻辑

这样修改后,批处理就会只压缩目录中大于25KB的JPG文件,同时日志记录也会更准确。

内容的提问来源于stack exchange,提问作者Cheese

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 08:52:41