请求协助:实现文件夹修改时间对比判断功能
批处理实现文件夹修改时间超时判断
以下提供两种实现方案,核心逻辑是将文件夹修改时间与当前时间转换为可计算的数值,对比时间差是否超过4小时(14400秒),输出对应结果。
方案一:通用可靠版(不受系统区域格式影响)
使用wmic命令获取标准格式的时间,避免不同系统区域时间格式差异导致的解析错误:
@echo off setlocal enabledelayedexpansion :: 配置要检测的文件夹路径 set "targetFolder=C:\Program Files" :: 获取当前系统时间的标准格式,转换为时间戳字符串(YYYYMMDDHHMMSS) for /f "tokens=2 delims==" %%a in ('wmic os get localdatetime /value') do set "currentTimeRaw=%%a" set "currentTimestamp=!currentTimeRaw:~0,4!!currentTimeRaw:~4,2!!currentTimeRaw:~6,2!!currentTimeRaw:~8,2!!currentTimeRaw:~10,2!!currentTimeRaw:~12,2!" :: 转换为总秒数 call :convertToSeconds !currentTimestamp! currentTotalSec :: 获取目标文件夹的最后修改时间,转换为时间戳字符串 for /f "tokens=2 delims==" %%a in ('wmic folder where "name='%targetFolder:\=\\%'" get lastmodified /value') do set "modTimeRaw=%%a" set "modTimestamp=!modTimeRaw:~0,4!!modTimeRaw:~4,2!!modTimeRaw:~6,2!!modTimeRaw:~8,2!!modTimeRaw:~10,2!!modTimeRaw:~12,2!" :: 转换为总秒数 call :convertToSeconds !modTimestamp! modTotalSec :: 计算时间差(秒),4小时对应14400秒 set /a timeDiff=currentTotalSec - modTotalSec :: 判断并输出结果 if !timeDiff! gtr 14400 ( echo 1 ) else ( echo 0 ) endlocal exit /b :: 子函数:将YYYYMMDDHHMMSS格式的时间转换为总秒数(简化处理,不考虑闰年,需精确可自行调整) :convertToSeconds set "timeStr=%~1" :: 拆分年、月、日、时、分、秒 set "year=!timeStr:~0,4!" set "month=!timeStr:~4,2!" set "day=!timeStr:~6,2!" set "hour=!timeStr:~8,2!" set "minute=!timeStr:~10,2!" set "second=!timeStr:~12,2!" :: 计算到当月的总天数 set "monthDays=31 28 31 30 31 30 31 31 30 31 30 31" set /a totalDays=0 set "count=1" for %%m in (%monthDays%) do ( if !count! lss !month! set /a totalDays+=%%m set /a count+=1 ) set /a totalDays+=day-1 :: 转换为总秒数 set /a totalSec=year*365*86400 + totalDays*86400 + hour*3600 + minute*60 + second set "%~2=!totalSec!" exit /b
方案二:基于你提供的命令(依赖系统区域时间格式)
如果必须使用FOR %A IN ("C:\Program Files") DO @ECHO=%~tA获取修改时间,需适配系统的时间格式(示例针对中文系统的yyyy/MM/dd HH:mm格式):
@echo off setlocal enabledelayedexpansion set "targetFolder=C:\Program Files" :: 获取当前系统的日期和时间 for /f "tokens=1" %%a in ('date /t') do set "currentDate=%%a" for /f "tokens=1" %%a in ('time /t') do set "currentTime=%%a" set "currentFullTime=!currentDate! !currentTime!" :: 获取目标文件夹的修改时间 for %%A in ("%targetFolder%") do set "modFullTime=%%~tA" :: 将时间转换为总秒数 call :timeToSec "!currentFullTime!" currentSec call :timeToSec "!modFullTime!" modSec :: 计算时间差并判断 set /a diff=currentSec - modSec if !diff! gtr 14400 ( echo 1 ) else ( echo 0 ) endlocal exit /b :: 子函数:将"yyyy/MM/dd HH:mm"格式转换为总秒数 :timeToSec set "timeStr=%~1" :: 拆分日期和时间部分 for /f "tokens=1-2 delims= " %%a in ("!timeStr!") do ( set "datePart=%%a" set "timePart=%%b" ) :: 拆分年、月、日 for /f "tokens=1-3 delims=/" %%a in ("!datePart!") do ( set "y=%%a" set "m=%%b" set "d=%%c" ) :: 拆分时、分 for /f "tokens=1-2 delims=:" %%a in ("!timePart!") do ( set "h=%%a" set "mi=%%b" ) :: 计算总天数(简化版,不考虑闰年) set "monthDays=31 28 31 30 31 30 31 31 30 31 30 31" set /a totalDays=0 set "cnt=1" for %%md in (!monthDays!) do ( if !cnt! lss !m! set /a totalDays+=%%md set /a cnt+=1 ) set /a totalDays+=d-1 :: 转换为总秒数 set /a totalSec=y*365*86400 + totalDays*86400 + h*3600 + mi*60 set "%~2=!totalSec!" exit /b
注意:方案二仅适配特定区域的时间格式,若系统是英文环境(时间格式为
MM/dd/yyyy HH:mm),需要修改子函数中的日期拆分逻辑。
内容的提问来源于stack exchange,提问作者kyrs161
相关产品推荐
相关产品推荐

