通过Cronical执行的BAT脚本中wmic获取时间戳突然失效问题排查
概述
我通过类Windows定时服务Cronical执行一个BAT脚本,此前10天运行一切正常,但今日时间戳计算突然失效,导致脚本执行异常。
异常现象
今日生成的日志文件名变为:
dailyOne_~0,8dt
而非预期的:
dailyOne_20260412_2000.log
我推测问题出在以下时间戳生成代码段,但不清楚为何今日突然出现异常:
REM ===== 3. Timestamp ===== for /f %%a in ('wmic os get localdatetime ^| find "."') do set dt=%%a set "TIMESTAMP=!dt:~0,8!_!dt:~8,6!"
疑问
- 脚本未做任何修改,此前运行正常
- 是否与今日日期(2026/04/14)有关?
- 是否是杀毒软件阻止了时间戳查询?
完整代码
以下为该BAT脚本的完整代码:
@echo off setlocal enabledelayedexpansion REM ===== 1. Read parameters ===== set "HOST=%~1" set "REPORT_NAME=%~2" REM ===== 2. Validate ===== if "%HOST%"=="" ( echo ERROR: Missing HOST exit /b 1 ) if "%REPORT_NAME%"=="" ( echo ERROR: Missing REPORT_NAME exit /b 1 ) REM ===== 3. Timestamp ===== for /f %%a in ('wmic os get localdatetime ^| find "."') do set dt=%%a set "TIMESTAMP=!dt:~0,8!_!dt:~8,6!" REM ===== 4. Log file ===== set "LOGFILE=%REPORT_NAME%_!TIMESTAMP!.txt" type nul > "%LOGFILE%" REM ===== 5. Live viewer ===== start "Log Viewer - %REPORT_NAME%" cmd /k powershell -NoExit -Command "Get-Content -Path '%LOGFILE%' -Wait" REM ===== 6. Start log ===== echo ================================================== >> "%LOGFILE%" echo [%DATE% %TIME%] START >> "%LOGFILE%" echo HOST=%HOST% >> "%LOGFILE%" echo REPORT=%REPORT_NAME% >> "%LOGFILE%" echo ================================================== >> "%LOGFILE%" REM ===== 7. Call API (NO TIMEOUT, NO RETRY) ===== echo [%DATE% %TIME%] Calling API... >> "%LOGFILE%" curl -N -sS ^ "http://%HOST%/process/reports/p?reportName=%REPORT_NAME%" ^ >> "%LOGFILE%" 2>&1 REM ===== 8. End log ===== echo. >> "%LOGFILE%" echo ================================================== >> "%LOGFILE%" echo [%DATE% %TIME%] END >> "%LOGFILE%" echo ================================================== >> "%LOGFILE%" echo Done. Log file: %LOGFILE% exit /b 0
Cronical.dat中的任务配置如下:
28 21 * * * cmd /c ""D:\Menelaos\sched_scripts\processReport.bat" server1:5000 dailyOne"
此前所有任务均正常执行,日志生成无异常
日志信息
今日收到的定时任务邮件中包含以下错误信息:
Cronical: Results from cmd /c
""D:\Menelaos\sched_scripts\processReport.bat" server1:5000
dailyOne"Invalid XSL format (or) file name. Done. Log file:
logs\dailyOne_0,8dt:8,4.logThe filename, directory name, or volume label syntax is incorrect.
以下为凌晨4点任务的日志片段:
2026-04-14 04:00:01.334 [154] Starting job: cmd /c ""D:\Menelaos\sched_scripts\processReport.bat" server:5000" 2026-04-14 04:06:41.293 WARN [162] Job failed to end, terminating program 2026-04-14 04:06:44.401 ERR [162] Win32Exception: The operation was canceled by the user Source: System TargetSite: Boolean StartWithShellExecuteEx(System.Diagnostics.ProcessStartInfo) Stack trace: at System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo) at System.Diagnostics.Process.Start(ProcessStartInfo startInfo) at Cronical.InjectCtrlC.Break(Int32 processId) at Cronical.Misc.ProcessWrapper.Stop() at DotNetCommons.Logging.Logger.Catch(Action action)
更新:替代方案
使用以下PowerShell方式获取时间戳后,异常消失:
REM ===== 3. Timestamp (NO seconds) ===== for /f %%a in ('powershell -NoProfile -Command "Get-Date -Format yyyyMMdd_HHmm"') do set "TIMESTAMP=%%a" if "%TIMESTAMP%"=="" ( echo ERROR: Failed to generate timestamp exit /b 1 )
但直接在CMD中执行WMIC命令正常,因此推测可能为以下三种原因之一:
- Cronical运行环境的PATH中未包含WMIC
- 杀毒软件或Windows智能扫描阻止了WMIC执行
- 相关系统策略限制
此外,注意到WMIC现已被弃用,尽管仍有大量教程将其作为获取时间戳的方案。
内容的提问来源于stack exchange,提问作者Μenelaοs
相关产品推荐
相关产品推荐

