Batch脚本调用7-Zip压缩指定扩展名文件时生成空压缩包如何解决
问题修复方案
问题根因
- 原脚本触发逻辑存在缺陷:只要遍历到任意格式的文件、且文件所在目录和上一次记录的目录不一致,就会直接调用7-Zip执行压缩,完全没有提前校验当前目录下是否存在匹配指定扩展名的目标文件
- 7-Zip命令行本身没有提供「无匹配文件时自动跳过、不生成压缩包」的内置参数,当传入的通配符没有匹配到任何文件时,会默认生成空压缩包,不会抛出终止类错误
修复方法
在脚本层增加两层校验逻辑:
- 对每个遍历到的目录,先检查是否存在匹配目标扩展名的文件,仅当存在符合要求的文件时才调用7-Zip执行压缩
- 压缩完成后增加兜底校验,如果生成的压缩包大小为0字节,直接删除,避免特殊场景下残留空包
修复后的完整代码如下:
@echo off setlocal enableDelayedExpansion set /p ext="Write with the . which extension you want to zip. : " set "targetPath=C:\Users\546802\Desktop\Test" set "7zPath=c:\Program Files\7-Zip\7z.exe" :: 遍历目标路径下所有文件夹 for /f "delims=" %%d in ('dir /b /s /ad "%targetPath%"') do ( set "matchFileExist=0" :: 检查当前文件夹内是否存在匹配指定扩展名的文件 for /f "delims=" %%f in ('dir /b /a-d "%%d\*!ext!" 2^>nul') do set "matchFileExist=1" if !matchFileExist! equ 1 ( :: 执行压缩操作 "!7zPath!" a -mx "%%d\%%~nd.zip" "%%d\*!ext!" >nul :: 兜底删除可能出现的空压缩包 if exist "%%d\%%~nd.zip" ( for %%z in ("%%d\%%~nd.zip") do if %%~zz equ 0 del /f /q "%%d\%%~nd.zip" ) ) ) endlocal
注意事项
- 原脚本在延迟展开开启的循环内使用
%ext%引用变量存在兼容性风险,修复后统一改为!ext!的延迟展开写法,避免变量取值异常 - 代码中
2^>nul的作用是屏蔽无匹配文件时dir命令抛出的错误提示,不影响正常逻辑执行 - 如果不需要压缩子目录下的嵌套文件夹,可以在dir遍历目录的命令中增加参数限制遍历层级
内容的提问来源于stack exchange,提问作者Blaztolen
相关产品推荐
相关产品推荐

