Batch file Forfiles命令删除.bat文件中12小时前的文件

Batch file Forfiles命令删除.bat文件中12小时前的文件,batch-file,Batch File,我知道删除旧文件的命令。 如何使用forfiles命令删除12小时前的文件 我正在.bat文件中使用forfile命令好的,我为你做了很多工作 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

我知道删除旧文件的命令。 如何使用forfiles命令删除12小时前的文件


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

好的,我为你做了很多工作

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
检查代码备注中的预期日期和时间格式


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

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

我已经编写了一个方便的混合JScript/批处理实用程序,它执行日期和时间算术以及格式化。它可以用来确定12小时前的日期和时间,并将其格式化为几乎任何需要的格式。该实用程序可以在XP以后的任何Windows平台上运行。它是纯脚本,因此不需要下载或安装任何exe文件。实际的实用程序位于本文的底部,它在脚本中包含大量的文档

FOR
命令可以给出最后修改的日期和时间,但它使用本地化格式,这使得使用通用代码进行解析变得困难。更糟糕的是,它忽略了夏令时是否有效。因此,在标准时间和夏令时之间转换任一方向时,不可能准确地确定几天内经过的时间

WMIC以一种通用格式提供时间戳,该时间戳包含用于夏令时的时区信息,在不同地区之间不存在差异。时间戳的格式在进行字符串比较时按时间顺序排序,这是非常重要和有用的一点

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

假设
getTimestamp.bat
位于当前文件夹中,或者更好的情况是位于
路径中的某个位置,那么以下操作应该可以工作。我相信它应该在世界任何地方都能工作,只要当地的夏令时调整是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

forfiles的工作时间为天,而不是小时。使用哪个命令来删除.bat文件中源位置和目标位置的小时旧文件。您可以使用
for
~t
参数(检查
中的%%i(*.*)DO ECHO%%i,%%ti
),但所有时间字符串解析都必须以艰苦的方式完成!免费私人使用
XXcopy
具有日/小时/分钟的粒度,应该可以使用。它可能有一个删除选项,或者只是复制/移动到一个空文件夹,然后删除该文件夹。这可以通过纯批处理完成,但不能由我完成。我们今天的温度是36°C(97°F),没有空调:/+1,我假设您的代码是正确的。总体战略看来是健全的。但是,在夏令时和标准时间之间的过渡日,它不会给出正确的结果。切断将在一个方向或另一个方向关闭1小时。文件时间戳包括时区偏移信息,用于说明是否存在夏令时。但是,
%%~tf
报告的时间戳忽略了时区信息。不,当夏令时使事情复杂化时不会。示例:美国夏时制始于2013年3月10日。当前时间戳为2013年3月10日美国东部时间09:01(UTC-04:00)。文件时间戳为2013年3月9日美国东部时间21:00(UTC-05:00)。您的代码计算的差异为12:01,实际差异为11:01。问题是
%date%
%time%
,以及
%%~tf
忽略时区信息,其中考虑了夏令时。