如何在列出.7z文件内文件详情时加入日期筛选参数?
按修改日期筛选7z包内文件的Bat命令优化
你原来的批量列7z内容的命令确实好用,要加上日期筛选的话,分两种场景给你实用方案:
1. 快速筛选单一特定日期的文件(保留原表格格式)
如果只需要抓取某个固定日期(比如示例里的2018-04-10)的文件,我们可以先手动写入表格表头(避免被过滤掉),再用findstr匹配包含目标日期的行:
@echo off rem 先写入表格表头到结果文件 echo Date Time Attr Size Compressed Name > listing.txt echo ------------------- ----- ------------ ------------ ------------------------ >> listing.txt rem 遍历所有7z文件,筛选指定日期的行 FOR /F "tokens=* delims=" %%A in ('dir /b /s *.7z') do ( 7z.exe l -r "%%A" | findstr /C:"2018-04-10" >> listing.txt )
这个命令的输出格式和你原来的完全一致,只是只保留2018-04-10的文件行,非常简洁高效。
2. 用7z详细输出做更灵活的筛选(比如日期范围)
如果需要筛选日期范围(比如2018-04-10到2018-04-12),可以用7z的-slt参数输出详细元数据(每行是键 = 值的格式,比如Modified = 2018-04-10 00:15:06),再结合Bat的变量判断来筛选:
@echo off setlocal enabledelayedexpansion set "targetStartDate=2018-04-10" set "targetEndDate=2018-04-12" rem 初始化结果文件表头 echo Date Time Attr Size Compressed Name > listing.txt echo ------------------- ----- ------------ ------------ ------------------------ >> listing.txt FOR /F "tokens=* delims=" %%A in ('dir /b /s *.7z') do ( set "currentFileDate=" set "shouldCapture=0" rem 解析7z的详细输出 for /F "tokens=1,2 delims==" %%B in ('7z.exe l -r -slt "%%A"') do ( rem 提取文件修改日期(只取YYYY-MM-DD部分) if "%%B"=="Modified " ( set "currentFileDate=%%~C" set "currentFileDate=!currentFileDate:~0,10!" rem 比较日期(YYYY-MM-DD格式可以直接字符串比较) if "!currentFileDate!" GEQ "!targetStartDate!" if "!currentFileDate!" LEQ "!targetEndDate!" ( set "shouldCapture=1" ) else ( set "shouldCapture=0" ) ) rem 如果当前文件符合日期,就提取文件名并补全信息 if "%%B"=="Name " if !shouldCapture! equ 1 ( rem 这里可以根据需求调整输出格式,或者扩展为提取完整表格行 echo !currentFileDate! [对应时间] [属性] [大小] [压缩大小] %%~C >> listing.txt ) ) ) endlocal
这个方法适合更复杂的筛选需求,注意要开启enabledelayedexpansion来处理循环内的变量。
小提示
- 测试的时候可以先把
>> listing.txt改成>> test.txt,避免覆盖原有结果文件。 - 如果你需要更精准的时间筛选(比如某一天的某个时段),可以把
findstr的匹配内容改成2018-04-10 00:这样的格式,缩小范围。
内容的提问来源于stack exchange,提问作者Priyanka Singh
相关产品推荐
相关产品推荐

