我知道删除文件的命令然后是几天。 如何使用forfiles命令删除12小时旧文件
我在.bat文件中使用forfile命令
答案 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