Forfiles命令删除.bat文件中的12小时旧文件

时间:2013-08-02 06:51:18

标签: batch-file

我知道删除文件的命令然后是几天。 如何使用forfiles命令删除12小时旧文件

我在.bat文件中使用forfile命令

2 个答案:

答案 0 :(得分:4)

好的,我为你努力工作......

SETLOCAL ENABLEDELAYEDEXPANSION
REM 1: Parse date time string
FOR /F "TOKENS=1-5 DELIMS=/-:,. " %%i IN ("%DATE% %TIME%") DO (
    SET year=%%k
    SET month=%%j
    SET day=%%i
    SET hour=%%l
    SET minute=%%m
)
REM 2: Subtract 12 hours, handling day wrap including leap year.
SET /A hour-=12
IF %hour% LSS 0 SET /A hour+=24 & SET /A day-=1
IF %day% LSS 1 (
   SET /A month-=1
   IF !month! LSS 1 SET /A month+=12 & SET /A year-=1
   FOR %%m IN (1 3 5 7 8 10 12) DO IF %%m == !month! SET /A day+=31
   FOR %%m IN (4 6 9 11) DO IF %%m == !month! SET /A day+=30
   IF !month! == 2 (
    SET /A day+=28
    SET /A y4=!year! %% 4
        IF !y4! == 0 (
        SET /A y400=!year! %% 400
        IF !y400! == 0 (
            SET /A day+=1
        ) ELSE (
            SET /A y100=!year! %% 100
            IF NOT !y100! == 0 SET /A day+=1
        )
    )
    )
)
REM 3: Normalize string for later string comparison
CALL :norm_datetime "%day%-%month%-%year% %hour%:%minute%" limit_datetime
REM 4: List file, parse file sate time and delete on comparison verified.
FOR %%f IN (*.*) DO (
    CALL :norm_datetime "%%~tf" file_datetime
    IF !file_datetime! LSS %limit_datetime% ECHO DEL %%f
)
ENDLOCAL
GOTO :EOF

REM 4: function to normalize date time string
REM norm_datetime "time string" output_environment_variable
REM time string format must be d-m-y-h-m[-...], where - is any valid separator.
REM output will be YYYYMMDDTHHMM
:norm_datetime
FOR /F "TOKENS=1-5 DELIMS=/-:,. " %%i IN ("%~1") DO (
    SET year=0000%%k
    SET month=00%%j
    SET day=00%%i
    SET hour=00%%l
    SET minute=00%%m
)
SET %2=%year:~-4%%month:~-2%%day:~-2%T%hour:~-2%%minute:~-2%
GOTO :EOF

检查代码备注中的预期日期和时间格式。

请注意,日期和时间格式取决于系统,因此必须针对不同的系统调整此代码。

答案 1 :(得分:2)

在Windows批处理中使用日期和时间是多么困难是荒谬的。我怀疑PowerShell可能会更好,但我真的不知道。

我编写了一个方便的混合JScript /批处理实用程序,它可以进行日期和时间算术和格式化。它可用于确定12小时前的日期和时间,并以几乎任何所需格式对其进行格式化。该实用程序适用于从XP开始的任何Windows平台。它是纯脚本,因此不需要下载或安装任何exe文件。 getTimestamp.bat is available here。实际的实用程序位于帖子的底部,它包含脚本中的大量文档。

FOR命令可以提供上次修改的日期和时间,但它使用本地化格式,这使得难以使用通用代码进行解析。更糟糕的是,它忽略了夏令时是否有效。因此,无法准确确定在标准时间和夏令时之间转换任何方向的天数。

WMIC提供时间戳,其中包含用于夏令时的时区信息,其通用格式在不同区域设置之间不同。时间戳采用的格式在进行字符串比较时按时间顺序排序,这是非常重要和有用的一点。

getTimestamp.bat实用程序可用于获取当前时间戳和删除的截止时间戳。如果文件时间戳和当前时间戳与夏令时不一致,则需要调整+或 - 一小时。格式化截止值以匹配WMIC时间戳,使比较变得简单。

假设getTimestamp.bat位于当前文件夹中,或者更好,位于PATH中的某个位置,则以下内容应该有效。我相信它应该可以在世界任何地方使用,只要当地的夏令时调整是1小时。我不知道是否有任何日光节约不是一个小时的地方。

我一般都会对代码进行测试,但我还没有测试过夏令时过渡日。我可能会倒退我的逻辑。

@echo off
setlocal disableDelayedExpansion

:: Define the folder to delete from.
:: The value must be a path without a file name or file wild cards.
set "folderPath=d:\test"

:: Define the hour offset for the deletion cutoff
set /a hourOffset=-12

for /f "delims=" %%F in ("%folderPath%\") do (
  set "driveFilter=%%~dF"
  set "pathFilter=%%~pF"
)
for /f "tokens=1-3" %%A in ('getTimestamp -f "{ums} {zzzz} {z}"') do (
  set "now=%%A"
  set "tz=%%B"
  set "z=%%C"
)
call getTimestamp -d %now% -oh %hourOffset% -f {yyyy}{mm}{dd}{hh}{nn}{ss} -r cutoff
call getTimestamp -d %now% -oh %hourOffset%-1 -f {yyyy}{mm}{dd}{hh}{nn}{ss} -r cutoff-1
call getTimestamp -d %now% -oh %hourOffset%+1 -f {yyyy}{mm}{dd}{hh}{nn}{ss} -r cutoff+1
for /f "tokens=1* delims=." %%A in (
  'wmic datafile where "Drive='%driveFilter%' and Path='%pathFilter:\=\\%'" get LastModified^,Name'
) do for /f "tokens=2* delims=+- " %%C in ("%%B") do (
  if "%%C" neq "%tz:~1%" (
    set "fz=%%B"
    set "file=%%~fD"
    setlocal enableDelayedExpansion
    set /a "fz=!fz:~6,1!1!fz:~7,3!%%1000"
    if !fz! lss !z! if "%%A" leq "%cutoff-1%" del "!file!"
    if !fz! gtr !z! if "%%A" leq "%cutoff+1%" del "!file!"
    endlocal
  ) else (
    if "%%A" leq "%cutoff%" del "%%~fD"
  )
)
exit /b