windows批处理可实现日志按天轮转:用powershell获取iso格式日期,比对last_date.txt中记录的上次日期,不一致则重命名当前日志并更新标记文件。
在 windows 批处理中实现日志按天轮转,核心思路是:每次运行脚本时,检查当前日期是否与日志文件名中的日期不一致;若不一致,则重命名旧日志(如加日期后缀),再新建当日日志。无需第三方工具,纯 cmd 可完成。
用日期生成动态日志文件名
批处理无法直接获取格式化日期(如 2024-05-20),需借助 %date% 和字符串截取。注意:%date% 格式依赖系统区域设置,稳妥做法是用 PowerShell 一行生成标准日期:
set "today=%~n0_%date:~0,4%%date:~5,2%%date:~8,2%.log"更可靠写法(兼容所有系统):
for /f "usebackq delims=" %%i in (`powershell -command "Get-Date -Format 'yyyy-MM-dd'"`) do set "today=%%i"set "logname=app_%today%.log"
判断是否需要轮转并归档旧日志
轮转的关键是识别“上次运行日”和“今天”是否不同。可将上一次的日期存在一个临时标记文件(如 last_date.txt)中:
- 读取 last_date.txt 中的内容作为 last_day
- 对比 last_day 与当前 %today%,不相等则执行归档
- 归档操作:把当前主日志(如 app_current.log)重命名为 app_2024-05-19.log
- 更新 last_date.txt 为今天的日期
完整轮转逻辑示例(含错误防护)
以下是一个轻量、健壮的轮转片段,可嵌入你的主脚本开头:
@echo offsetlocal enabledelayedexpansion
:: 获取今日日期(ISO 格式)
for /f "usebackq delims=" %%i in (`powershell -command "Get-Date -Format 'yyyy-MM-dd'"`) do set "TODAY=%%i"
set "LOG_BASE=app"
set "CURRENT_LOG=%LOG_BASE%_current.log"
set "LAST_DATE_FILE=last_date.txt"
:: 初始化 last_date.txt(首次运行)
if not exist "%LAST_DATE_FILE%" echo %TODAY% > "%LAST_DATE_FILE%"
:: 读取上次日期
set "LAST_DAY="
for /f "usebackq tokens=*" %%d in ("%LAST_DATE_FILE%") do set "LAST_DAY=%%d"
:: 判断是否需要轮转
if not "%LAST_DAY%"=="%TODAY%" (
if exist "%CURRENT_LOG%" (
ren "%CURRENT_LOG%" "%LOG_BASE%_%LAST_DAY%.log" 2>nul
if errorlevel 1 echo [WARN] 无法重命名旧日志,可能被占用。
)
echo %TODAY% > "%LAST_DATE_FILE%"
echo [%TIME%] 日志已轮转至 %LOG_BASE%_%LAST_DAY%.log
)
:: 追加日志到当前文件
echo [%DATE% %TIME%] 正在运行... >> "%CURRENT_LOG%"
补充建议
- 日志路径建议用绝对路径(如 %~dp0logs\),避免因工作目录变化出错
- 若脚本高频运行(如每分钟),可在轮转前加锁机制(例如尝试创建同名 .lock 文件)
- 定期清理旧日志?可加一句:forfiles /p "%~dp0" /s /d -30 /c "cmd /c if @isdir==FALSE del @path"(删 30 天前日志)
- 想合并查看?所有日志命名统一后,type app_2024*.log > all.log 即可











