求助:如何实现批处理脚本检查文件最后修改日期匹配当前日期
嘿,恭喜开启你的学徒生涯第一个脚本任务!我来帮你搞定文件修改日期检查的核心部分,还会优化你现有的代码,让它更健壮。
首先,咱们得解决日期格式兼容性的问题——因为不同系统的%date%输出格式可能不一样(比如有的是MM/DD/YYYY,有的是DD/MM/YYYY),直接对比容易出错。我会用wmic命令获取标准格式的日期,保证兼容性。
接下来是核心需求:检查指定目录下的目标文件是否全部为今日修改。如果全部符合,输出到test.txt;如果有任何一个不符合,生成唯一的error_X.txt文件(避免覆盖旧的错误日志)。
下面是完整的脚本代码,我会逐段解释:
@echo off setlocal enabledelayedexpansion :: 1. 获取标准格式的当前日期(避免区域设置导致的格式混乱) for /f "skip=1 tokens=2-4 delims=." %%a in ('wmic os get localdatetime') do ( set "year=%%c" set "month=%%a" set "day=%%b" goto :date_acquired ) :date_acquired :: 根据你的系统短日期格式调整这里!比如系统显示"13/09/2024"就写成%day%/%month%/%year%,显示"09/13/2024"就写成%month%/%day%/%year% set "currdate=%day%/%month%/%year%" :: 2. 设置路径变量(方便后续修改维护) set "excel_dir=C:\Users\mmi\Desktop\batch\qvtests" set "txt_dir=C:\Users\mmi\Desktop\batch\qvtests\dossier" set "output_root=C:\Users\mmi\Desktop" :: 3. 标记是否存在非今日修改的文件(0=全部符合,1=存在异常) set "has_error=0" :: 检查excel文件:查找修改日期早于今天的文件 forfiles /P "%excel_dir%" /M *excel.xlsx* /D -1 /C "cmd /c exit 1" >nul 2>&1 if not errorlevel 1 ( set "has_error=1" ) :: 检查txt文件:同样查找修改日期早于今天的文件 forfiles /P "%txt_dir%" /M *.txt* /D -1 /C "cmd /c exit 1" >nul 2>&1 if not errorlevel 1 ( set "has_error=1" ) :: 4. 根据检查结果执行对应分支 if %has_error% equ 0 ( goto :correct ) else ( goto :error ) :correct :: 输出到test.txt echo. >> "%output_root%\test.txt" echo %currdate% >> "%output_root%\test.txt" forfiles /P "%excel_dir%" /M *excel.xlsx* /C "cmd /c echo @file @fdate @ftime" >> "%output_root%\test.txt" forfiles /P "%txt_dir%" /M *.txt* /C "cmd /c echo @file @fdate @ftime" >> "%output_root%\test.txt" echo 所有文件均为今日修改,结果已保存至test.txt goto :end :error :: 生成唯一的error_X.txt文件名(避免覆盖旧日志) set "error_num=1" :find_unique_error_file if exist "%output_root%\error_%error_num%.txt" ( set /a error_num+=1 goto :find_unique_error_file ) set "error_file=%output_root%\error_%error_num%.txt" :: 输出到新的错误日志 echo. >> "%error_file%" echo %currdate% >> "%error_file%" forfiles /P "%excel_dir%" /M *excel.xlsx* /C "cmd /c echo @file @fdate @ftime" >> "%error_file%" forfiles /P "%txt_dir%" /M *.txt* /C "cmd /c echo @file @fdate @ftime" >> "%error_file%" echo 发现非今日修改的文件,结果已保存至%error_file% goto :end :end endlocal
关键细节解释:
- 日期格式适配:一定要根据你系统的短日期格式调整
currdate的拼接方式。你可以先在命令行输入date查看格式,比如显示2024-09-13就改成set "currdate=%year%-%month%-%day%"。 - 错误判断逻辑:
forfiles /D -1会查找修改日期早于今天的文件,如果找到这样的文件,就会执行exit 1,此时errorlevel不为1,我们就标记has_error=1。 - 唯一错误文件名:通过循环递增
error_num,直到找到不存在的error_X.txt,这样每次出错都会生成新文件,不会覆盖之前的日志。 - 变量化路径:把所有固定路径改成变量,以后修改路径只需要改开头的变量,不用到处找替换。
如果还有不清楚的地方,随时问哦!
内容的提问来源于stack exchange,提问作者Maxime Michon
相关产品推荐
相关产品推荐

