在批处理(.bat/.cmd)中支持多种文件类型,核心在于如何构建 for 循环的匹配列表。CMD 的 for 命令非常灵活,允许你在一次循环中指定多个通配符模式。
以下是几种实现“CMD 处理脚本多文件类型支持”的常用方法,从简单到高级:
方法一:直接在 in () 中列出多个通配符(最推荐)
这是最简单、最直接的方法。你只需要在 for 命令的括号内,用空格分隔不同的文件扩展名模式即可。语法结构如下:
for %%f in (*.jpg *.png *.gif *.bmp) do (
:: 处理逻辑
)
假设你要处理 .jpg, .png, .webp 三种格式的图片,你可以使用以下批处理命令脚本:
@echo off
setlocal enabledelayedexpansion
echo 开始处理多种图片格式...
:: 关键点:在 in () 中用空格分隔不同的通配符
for %%f in (*.jpg *.png *.webp) do (
if exist "%%f" (
set "newname=IMG_%%f"
echo 重命名: "%%f" -> "!newname!"
ren "%%f" "!newname!"
)
)
echo 处理完成!
pause
如果你不想列举所有扩展名,而是想处理“除了系统文件以外的所有文件”,或者根据文件内容/大小来决定是否处理,可以先匹配所有文件 (*),然后在循环内部通过子字符串操作来判断扩展名。
以下是只处理特定扩展名,但遍历所有文件。
@echo off
setlocal enabledelayedexpansion
for %%f in (*) do (
:: 跳过当前脚本文件本身,防止死循环
if not "%%f"=="%~nx0" (
:: 获取扩展名并转为小写 (CMD 默认不区分大小写,但为了严谨)
set "ext=%%~xf"
:: 判断扩展名是否在目标列表中
:: 技巧:将目标列表和当前扩展名都包裹在逗号中,用 findstr 查找
echo ",.jpg,.png,.webp," | findstr /i ",!ext!," >nul
if !errorlevel! equ 0 (
echo [匹配成功] 处理文件: %%f
:: 执行重命名
rem ren "%%f" "Processed_%%f"
) else (
echo [跳过] 非目标格式: %%f
)
)
)
pause
逻辑控制力最强,可以结合 if 做非常复杂的判断(例如:如果是 .jpg 且大于 1MB 才处理)。不需要修改 for 语句就能动态调整规则。
缺点就是代码稍显复杂。效率略低于方法一(因为要遍历所有文件并在内部做判断)。
如果需要处理子文件夹里的多种文件,只需在 for 中加入 /r 参数,并同样列出多个通配符。
@echo off
setlocal enabledelayedexpansion
echo 开始递归扫描...
:: /r 表示递归,后面依然可以跟多个通配符
for /r %%f in (*.docx *.pdf *.pptx) do (
echo 发现文档: %%f
:: 注意:ren 命令不能改变路径,只能改文件名
:: %%~nf 是文件名,%%~xf 是扩展名
set "newname=Archived_%%~nf%%~xf"
:: 为了防止路径过长或特殊字符报错,建议加引号
ren "%%f" "!newname!"
)
pause
空格分隔:在 in () 中,不同的通配符之间必须用空格分隔,不能用逗号。
如果某个通配符(如 *.png)在当前目录下没有匹配到任何文件,CMD 不会报错,它会直接跳过该模式继续执行下一个。这是安全的行为。
CMD 的通配符匹配默认是不区分大小写的。*.JPG 和 *.jpg 效果一样。如果文件名中包含空格,%%f 变量会自动包含空格,所以在 ren 和 if exist 中务必给变量加上双引号,如 ren "%%f" "newname"。
通过以上方法,你可以轻松让批处理脚本同时驾驭几十种不同的文件格式,实现真正的自动化批量处理。