需求:用Windows原生tar每周一归档上周一至周日的日志文件
上周日志自动压缩归档的Windows批处理实现
问题背景
需要每周一自动执行脚本,将上周一至周日的.log日志文件压缩为ZIP包,并移动到指定归档文件夹。仅能使用Windows原生命令(无第三方压缩工具),现有脚本无法筛选目标日期范围的文件。
现有基础脚本:
@echo off set "srcFolder=D:\Data\Logs\*.log" set "archFile=ETLDataLogs.zip" tar.exe acvf "%archFile%" "%srcFolder%"
解决方案
核心思路:通过PowerShell计算上周的日期范围,用forfiles筛选符合日期的日志文件,再传递给tar命令压缩,最后完成归档移动。
完整批处理脚本
@echo off setlocal enabledelayedexpansion :: 自定义路径配置 set "logFolder=D:\Data\Logs" :: 日志文件所在目录 set "archFolder=D:\Data\Archive" :: 归档文件夹路径 set "archFile=ETLDataLogs_!date:~0,4!!date:~5,2!!date:~8,2!.zip" :: 带日期的压缩包名称 :: 用PowerShell计算上周一、上周日的日期(格式适配forfiles:MM/dd/yyyy) for /f "delims=" %%a in ('powershell -Command "$lastMonday = (Get-Date).AddDays(-(Get-Date).DayOfWeek.value__ - 6); $lastSunday = (Get-Date).AddDays(-(Get-Date).DayOfWeek.value__); '{0:MM/dd/yyyy}|{1:MM/dd/yyyy}' -f $lastMonday, $lastSunday"') do ( set "dateRange=%%a" ) :: 拆分日期范围变量 set "lastMonday=!dateRange:^|=!" set "lastSunday=!dateRange:*|=!" :: 筛选上周范围内的日志文件,写入临时列表 forfiles /p "%logFolder%" /m *.log /d +"!lastMonday!" /d -"!lastSunday!" /c "cmd /c echo @path" > "%temp%\logfiles.txt" :: 检查是否存在目标文件 if not exist "%temp%\logfiles.txt" ( echo 未找到上周的日志文件 goto :eof ) :: 调用tar压缩指定文件列表 tar.exe acvf "%archFile%" --files-from="%temp%\logfiles.txt" :: 归档压缩包(自动创建归档文件夹) if not exist "%archFolder%" mkdir "%archFolder%" move /y "%archFile%" "%archFolder%\" :: 清理临时文件 del "%temp%\logfiles.txt" echo 上周日志归档完成 endlocal
关键说明
- 日期计算逻辑:
借助PowerShell获取当前日期的星期值(0=周日,6=周六),每周一执行时,通过AddDays计算出上周一(当前日期减7天再加1天)和上周日(当前日期减1天),确保覆盖完整的上周周期。 - 文件筛选:
使用forfiles命令的/d +(大于等于指定日期)和/d -(小于等于指定日期)参数,精准筛选上周日志,并将文件路径写入临时列表。 - tar压缩优化:
通过--files-from参数读取临时文件列表,避免压缩无关文件;压缩包名称加入执行当天的日期,防止覆盖历史归档。 - 自动归档:
自动检查并创建归档文件夹,完成压缩包的移动操作,最后清理临时文件。
注意事项
- 确保系统支持PowerShell(Windows 7及以上默认预装)。
- 若系统日期格式为
dd/MM/yyyy,需修改PowerShell命令中的格式字符串为{0:dd/MM/yyyy}|{1:dd/MM/yyyy},否则forfiles无法正确识别日期。 - 测试阶段可将
tar.exe命令替换为echo tar.exe,先验证目标文件列表是否正确。
内容的提问来源于stack exchange,提问作者Naveen Kumar
相关产品推荐
相关产品推荐

