批处理脚本,用于检查创建/修改目录中的最新文件的时间

时间:2011-03-22 23:16:49

标签: batch-file

我是新手脚本,所以请原谅我。我需要创建一个Windows批处理脚本来完成以下任务:

  • 检查指定目录的根目录并标识最近修改或创建的文件
  • 如果文件未在过去24小时内(从批处理文件运行时)修改或创建,则执行另一个指定的脚本。我已经自己处理了这个脚本,触发了警报/电子邮件。

我将通过任务计划程序运行此程序。任何帮助将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:1)

您应该可以使用Forefiles

完成此操作

答案 1 :(得分:1)

此命令列出按修改时间排序的文件。最新的一个是最后一个。

> dir /Od /B

此命令运行上一个命令并将最后一个文件存储在变量FILE

> for /F "usebackq" %f in (`dir /Od /B`) do set "FILE=%f"

此命令显示特定文件的文件信息:

> dir /N "%FILE%" | findstr /B "[0-9]"

此命令将运行上一个命令,并对其进行解析。字段的顺序(年,月,日......)和分隔符(/日期,在我的情况下为小时)取决于您的区域设置。

> for /f "usebackq tokens=1-5 eol=\  delims=/:\ " %i in (`dir /N "%FILE%" ^| findstr /B "[0-9]"`) do echo [%i%j%k] [%l%m]

我们可以将结果存储在变量中:

> for /f "usebackq tokens=1-5 eol=\  delims=/:\ " %i in (`dir /N "%FILE%" ^| findstr /B "[0-9]"`) do set DD=%i&set MM=%j&set YYYY=%k&set HH=%l&set MI=%m

这些命令显示当前日期和时间:

> date /t
> time /t

这些命令运行,解析并存储到变量中:

> for /F "usebackq tokens=1-3 delims=%DATE_DELIM%" %i in (`date /t`) do set DD=%i&set MM=%j&set YYYY=%k
> for /F "usebackq tokens=1,2 delims=%TIME_DELIM%" %i in (`time /t`) do set HH=%i&set MI=%j

这很容易。我们现在必须做一些算术来比较日期。 set /A可以做算术,但会将“08”解释为八进制。所以我们必须通过删除前导'0'将值转换为十进制:

> set /A DD=1%DD%-100&set /A MM=1%MM%-100
> set /A HH=1%HH%-100&set /A MI=1%MI%-100

这是最终的脚本。 我不得不使用很多技巧来做日期/时间算术,因此“24h”是硬编码的。

@echo off
setlocal
set DIR=%~f1
set DATE_DELIM=/
set TIME_DELIM=:
for /F "usebackq" %%f in (`dir /Od /B "%DIR%"`) do set "FILE=%%f"

for /F "usebackq tokens=1-5 eol=\  delims=%DATE_DELIM%%TIME_DELIM%\ " %%i in (`dir /N "%FILE%" ^| findstr /B "[0-9]"`) do set A_DD=%%i&set A_MM=%%j&set A_YYYY=%%k&set A_HH=%%l&set A_MI=%%m
set A_DATE=%A_YYYY%%A_MM%%A_DD%
set /A A_DD=1%A_DD%-100&set /A A_MM=1%A_MM%-100
set /A A_TIME=(1%A_HH%-100)*60+%A_MI%-100

for /F "usebackq tokens=1-3 delims=%DATE_DELIM%\ " %%i in (`date /t`) do set B_DD=%%i&set B_MM=%%j&set B_YYYY=%%k
for /F "usebackq tokens=1,2 delims=%TIME_DELIM%\ " %%i in (`time /t`) do set B_HH=%%i&set B_MI=%%j
set B_DATE=%B_YYYY%%B_MM%%B_DD%
set /A B_DD=1%B_DD%-100&set /A B_MM=1%B_MM%-100
set /A B_TIME=(1%B_HH%-100)*60+%B_MI%-100

echo %A_DATE% %A_TIME% - %A_YYYY% %A_MM% %A_DD%
echo %B_DATE% %B_TIME% - %B_YYYY% %B_MM% %B_DD%

:: Check that the file is newer than 24 hours
:: This will not work at daylight change
:: This is probably full of bugs as I had no time to test all cases

if %A_DATE% GEQ %B_DATE% goto :NewFile

:: Past day
:: Whatever the day, if the time of the day is <, this is old
if %A_HH%%A_MI% LSS %B_HH%%B_MI% goto :OldFile

if not %B_MM%==1 goto :WhateverMonth

if %A_DATE:~1,6% EQU %B_DATE:~1,6% goto :SameMonth
:: Change Month
set /A D=%B_YYYY%*12+%B_MM%-%A_YYYY%*12+%A_MM%
if not %D%==-1 goto :OldFile
:LastMonth
:: Is A the last day of the month => yesterday ?
if %A_DD% EQU 2 goto :February
:: 31 is of course the last day
if %A_DD% EQU 31 goto :NewFile
if %A_DD% LSS 30 goto :OldFile

:: Months of 30 days
if %A_DD%==4 goto :NewFile
if %A_DD%==6 goto :NewFile
if %A_DD%==9 goto :NewFile
if %A_DD%==11 goto :NewFile
:: Day is 30 and month has 31 days
goto :OldFile

:February
set /A D=28+!(%A_YYYY% ^% 4)
if %A_DD%==%D% goto :NewFile
:: We do not have to handle others bissextile case which will happen in about
:: 389 years
goto :OldFile

:WhateverMonth
if %A_YYYY%%A_MM% EQU %B_YYYY%%B_MM% goto :SameMonth
goto :OldFile

:SameMonth
set /A D=100+%B_DD%-%A_DD%
if %D% GTR 101 goto :OldFile
:Yesterday
if %B_DD% GTR 1 goto :ChkTime

:ChkTime

:OldFile
echo %FILE% is old.
goto :End

:NewFile
echo %FILE% is new.
goto :End

:End
endlocal

运行它:

> CheckFile.cmd <directory>

这只是为了向您展示可能。但我不建议在进行大量测试之前将其投入生产。而且难以维护。因此,我建议在WSH环境或PowerShell中使用JScript而不是批处理。

答案 2 :(得分:0)

ls -t列出按修改时间排序的文件。您可以从其输出中获取第一个作为最近修改过的。