【问题标题】:File has been modified in the last 15 mins -Batch Script文件在过去 15 分钟内被修改 - 批处理脚本
【发布时间】:2016-08-10 08:44:38
【问题描述】:

您好,我需要帮助,因为我是 BatchScript 新手。 我需要检查目录中的任何文件/文件夹是否在过去 15 分钟内被修改。

这是我的逻辑:

  1. 查找最后修改日期
  2. 查找当前日期
  3. 查找这两者之间的差异是否为 15 分钟。 我可以做第 2 步。我坚持第 3 步 请帮我找出这两个日期之间的时差。 或者,如果有更好/更简单的逻辑。

这是我的代码:

@echo off
for /f %a in (' dir "D:\BatchFiles" /od/b/s/t') do set Date1= %~ta
echo The most recently created file is %Date1%
@echo off
for /f "delims=" %i in ('time /t') do set output=%i
@echo off
SET Date2= %DATE:~4,2%/%DATE:~7,2%/%DATE:~10,4% %output%
echo The current date is %Date2%
PAUSE

【问题讨论】:

  • 对于日期/时间数学,纯批处理既不是简单的也不是好的解决方案(尽管有可能)。考虑使用 Powershell、Java 或 VBA。

标签: date batch-file date-difference


【解决方案1】:

这是一个纯批处理文件,它返回给定目录中给定年龄的所有文件,具有以下限制:

  • 日期没有正确解析,所以如果一个文件在上个月被修改过,它可能不会被错误地包含在结果中;如果要以天为单位定义最大年龄,forfiles solution 可能更合理;
  • 路径中同时包含字符), 的文件将在输出中丢失;这是因为design flaw of the wmic command,它用于检索文件最后修改的与语言环境无关的日期/时间信息;

要使用脚本——让我们称之为max-aged-files.bat——,提供如下命令行参数:

max-aged-files.bat 15*60 "D:\BatchFiles"

第一个参数是以秒为单位的文件的最大年龄;可以理解像15*60 这样的简单算术表达式。第二个参数是用于搜索文件的位置和/或文件模式;你可以在这里声明像"D:\BatchFiles"这样的目录路径,或者像"*.bat"这样的文件模式,或者像"D:\BatchFiles\*.bat"这样的组合;如果省略,则使用当前目录。

代码如下:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem /* Please regard that this script cannot handle dates correctly!
rem    so if current date and file date are in different months it fails! */

rem // Retrieve and prepare arguments:
set "MAXAGE=%~1" & rem // (maximum age of files in terms of seconds)
if defined MAXAGE (set /A "MAXAGE=%MAXAGE%+0") else (
    >&2 echo ERROR: maximum age not specified! & exit /B 1
)
if %MAXAGE% GEQ 86400 (>&2 echo ERROR: maximum age exceeds range! & exit /B 1)
shift /1
set "LOCATION=%~1"
set "ATTR=%~a1"
set "ATTR=%ATTR:~,1%"
if not defined LOCATION (set "LOCATION=.\*.*") else (
    if "%ATTR%"=="d" set "LOCATION=%LOCATION%\*.*"
)
rem /* Gather current date/time in standardised format
rem    [like: `YYYYMMDDHHMMSS.UUUUUU+ZZZ`]: */
for /F "delims=" %%I in ('wmic OS GET LocalDateTime') do (
    for /F "delims=" %%J in ("%%I") do set "CURRTIME=%%J"
)
rem // Extract `YYYYMMSS` portion from current date/time:
set "CURRDATE=%CURRTIME:~,8%"
rem // Extract `HHMMSS` portion from current date/time only:
for /F "delims=." %%T in ("%CURRTIME:~8%") do (
    set "CURRTIME=%%T"
)
rem // Loop through all files at given location:
for %%F in ("%LOCATION%") do (
    set "ITEM=%%~fF"
    setlocal EnableDelayedExpansion
    rem // Gather file date/time in standardised format:
    for /F "delims=" %%E in ('
        2^> nul wmic DataFile WHERE Name^="!ITEM:\=\\!" GET LastModified ^|^| ^
        2^> nul wmic DataFile WHERE ^(Name^="!ITEM:\=\\!"^) GET LastModified
    ') do (
        for /F "delims=" %%F in ("%%E") do set "FILETIME=%%F"
    )
    rem // Extract `YYYYMMSS` portion from file date/time:
    set "FILEDATE=!FILETIME:~,8!"
    rem // Extract `HHMMSS` portion from file date/time:
    for /F "delims=." %%T in ("!FILETIME:~8!") do (
        set "FILETIME=%%T"
    )
    rem // Compute date difference between file and current date:
    set /A "DATEDIFF=CURRDATE-FILEDATE"
    rem // Continue processing only if date difference is zero or one:
    if !DATEDIFF! GEQ 0 if !DATEDIFF! LEQ 1 (
        rem // Convert date difference to seconds:
        set /A "DATEDIFF*=240000"
        rem // Compute time difference, regarding also date difference:
        set /A "TIMEDIFF=DATEDIFF+1!CURRTIME!-1!FILETIME!"
        rem // Pad time difference to consist of 6 digits [like `HHMMSS`]:
        set "TIMEDIFF=000000!TIMEDIFF!" & set "TIMEDIFF=!TIMEDIFF:~-6!"
        rem // Convert time difference to seconds:
        set /A "TIMEDIFF=1!TIMEDIFF:~-2!-100+60*(1!TIMEDIFF:~-4,-2!-100+60*(1!TIMEDIFF:~-6,-4!-100))"
        rem // Return item if 
        if !TIMEDIFF! LEQ %MAXAGE% (
            echo(!ITEM!
        )
    )
    endlocal
)

endlocal
exit /B

【讨论】:

    猜你喜欢
    • 2018-09-02
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多