【问题标题】:write a batch file to remove the folders by date and time wise编写一个批处理文件以按日期和时间删除文件夹
【发布时间】:2024-01-11 17:08:01
【问题描述】:

完全重复:

我在网络上的服务器上有一个名为“dump”的文件夹。每天都会有很多临时文件和文件夹保存在该文件夹中。

我想删除这些文件和子文件夹。条件是我只想在文件和文件夹前一小时删除,即在我们运行批处理文件的当前时间之前的一个。

这意味着我想在该文件夹中保留一个我们的文件以运行其他活动。 像现在这样。

  1. 转到文件夹并按时间列出文件
  2. 获取当前时间
  3. 删除比当前时间早 1 小时的文件

【问题讨论】:

  • 我知道如何使用 bash 脚本执行此操作.. 但不熟悉批处理中的相同功能

标签: datetime scripting batch-file


【解决方案1】:

我认为在这种情况下最好使用 PowerShell 或 WSH(如 Rihan Meij 所述)。比较数据和时间是可能的,但非常脆弱(因为没有办法以文化中立的方式批量获得数据/时间)。你可能会这样写:

setlocal enableextensions
set Now=%date%
set NowTime=%time:~0,-3%
call :tokenize_date %Now%
call :tokenize_time %NowTime%
echo %YEAR%-%MONTH%-%DAY%T%HOUR%:%MINUTE%:%SECOND%
call :one_hour_before %Now% %NowTime%
echo %RESULT_DATE% %RESULT_TIME%
ping -n 1 -w 1500 ::1>NUL
set Now2=%date%
set NowTime2=%time:~0,-3%
call :date_time_compare %Now% %NowTime% %Now2% %NowTime2%
echo %Now%T%NowTime% compared to %Now2%T%NowTime2%: %RESULT%
endlocal
goto :eof

:tokenize_date
    rem assuming ISO 8601 date format YYYY-MM-DD
    setlocal enableextensions
    set arg=%1
    set YEAR=%arg:~0,4%
    set MONTH=%arg:~5,2%
    set DAY=%arg:~8,2%
    endlocal&set YEAR=%YEAR%&set MONTH=%MONTH%&set DAY=%DAY%
goto :eof

:tokenize_time
    rem assuming ISO-8601 time format HH:MM:SS, 24-hour
    setlocal enableextensions
    set arg=%1
    set HOUR=%arg:~0,2%
    set MINUTE=%arg:~3,2%
    set SECOND=%arg:~6,2%
    endlocal&set HOUR=%HOUR%&set MINUTE=%MINUTE%&set SECOND=%SECOND%
goto :eof

:one_hour_before
    rem gets a date as %1 and a time as %2
    rem returns a date in RESULT_DATE and a time in RESULT_TIME
    setlocal enabledelayedexpansion enableextensions
    set months=31 28 31 30 31 30 31 31 30 31 30 31
    set i=0
    for %%x in (%months%) do (
        set /a i+=1
        set month_length_!i!=%%x
    )
    call :tokenize_date %1
    call :tokenize_time %2
    set /a HOUR-=1
    if %HOUR% LSS 0 (
        set /a DAY-=1
        set /a HOUR+=24
        if %DAY% LSS 0 (
            set /a MONTH-=1
            if %MONTH% LSS 0 (
                set /a YEAR-=1
                set /a MONTH+=12
            )
            set /a DAY+=month_length_!MONTH!
        )
    )
    endlocal&set RESULT_DATE=%YEAR%-%MONTH%-%DAY%&set RESULT_TIME=%HOUR%:%MINUTE%:%SECOND%
goto :eof

:date_time_compare
    rem expects %1 - date 1, %2 - time 1, %3 - date 2, %4 - time 2
    rem returns a value < 0 if datetime1 is earlier than datetime2
    rem                 > 0                 later than
    rem                 = 0                 equal to
    rem the return value is saved in the variable %RETURN%
    setlocal enableextensions
    call :tokenize_date %3
    call :tokenize_time %4
    set YEAR2=%YEAR%
    set MONTH2=%MONTH%
    set DAY2=%DAY%
    set HOUR2=%HOUR%
    set MINUTE2=%MINUTE%
    set SECOND2=%SECOND%
    call :tokenize_date %1
    call :tokenize_time %2
    if %YEAR2% GTR %YEAR% (endlocal&set RESULT=-1&goto :eof) else (
        if %YEAR2% LSS %YEAR% (endlocal&set RESULT=1&goto :eof) else (
            if %MONTH2%%DAY2%%HOUR2%%MINUTE2%%SECOND2% GTR %MONTH%%DAY%%HOUR%%MINUTE%%SECOND% (
                endlocal&set RESULT=-1&goto :eof
            ) else (
                if %MONTH2%%DAY2%%HOUR2%%MINUTE2%%SECOND2%==%MONTH%%DAY%%HOUR%%MINUTE%%SECOND% (
                    endlocal&set RESULT=0&goto :eof
                ) else (
                    endlocal&set RESULT=1&goto :eof
                )
            )
        )
    )
goto :eof

抱歉,时间有点长。比较日期/时间现在只经过部分测试,但应该可以工作。小心它包含亚秒的时间,因为这里引入了一个逗号,这会扰乱被调用子例程的参数顺序(因此%time:~0,-3% 可以避免这种情况)。

之后,您可以使用%~tI 扩展来获取日期和时间,将它们与当前的负一小时进行比较,如果适用则删除。

注意 1:我假设 ISO 8601 日期和时间格式为 24 小时,这就是我在这里使用的。对于非标准日期格式,您将不得不稍微更改子例程(但 12 小时的时间可能会很痛苦)。

注意 2:目前,该代码不关心闰年。我想,:one_hour_before 中应该还有 5 或 6 行代码。

【讨论】:

    【解决方案2】:

    我知道我知道您可能尝试做的唯一方法是使用 for 命令和 ~t 扩展参数。

    for %r in (*.*) DO echo %r "created on" %~tr
    

    产生:

    C:\>echo BOOTSECT.BAK "created on" 2009/02/17 11:59 PM
    BOOTSECT.BAK "created on" 2009/02/17 11:59 PM
    
    C:\>echo config.sys "created on" 2006/09/18 11:43 PM
    config.sys "created on" 2006/09/18 11:43 PM
    

    我认为更可能的情况是使用 windows 脚本主机或 powershell,但您没有提到这些是您的选择,所以我假设有一个很好的理由,不能使用这些技术.

    【讨论】: