如何在不使用forfiles的情况下删除超过N天的所有目录(和内容)?

时间:2015-01-31 19:57:06

标签: batch-file

我按照Batch file to delete folders older than N days except specific ones上的答案。

有没有办法删除早于N天的所有文件夹(及其内容)但是没有使用forfiles命令?

我的问题的原因是我的机器有一个旧的DOS版本,可能没有命令forfiles

1 个答案:

答案 0 :(得分:1)

这是一个不使用命令 forfiles 的批处理文件,用于删除C:\Temp递归中日期超过7天的所有文件夹。

所以它删除了2015-02-08所有文件夹,其日期最长为2015-01-31,同时保留所有文件夹的日期从2015-02-01开始。

请注意!

日期和时间字符串的格式取决于Windows语言设置。在Day的第一个 FOR 循环中分配给环境变量MonthYearGetSeconds的分隔符和标记顺序必须适应如有必要,可以使用当地日期/时间格式。

注意:还有 echo 命令 rd 只输出哪些文件夹将被递归删除。测试运行后必须删除 echo 以进行验证才能真正删除文件夹。

@echo off
setlocal EnableDelayedExpansion
rem Get seconds since 1970-01-01 for current day.
call :GetSeconds "%DATE%"
rem Subtract seconds for 8 days from seconds value.
set /A "LastWeek=Seconds-8*86400"

rem For each subdirectory of C:\Temp get date (without seconds)
rem and determine the number of seconds since 1970-01-01 for
rem this date/time. The directory can be deleted recursive
rem if seconds value is lower than the value calculated above.

for /D %%D in ("C:\Temp\*") do (
    call :GetSeconds "%%~tD"
    if !Seconds! LEQ %LastWeek% echo rd /S /Q "%%~fD"
)
endlocal
goto :EOF

:GetSeconds
for /F "tokens=1-3 delims=,-./: " %%A in ("%~1") do (
    rem For English US date MM/DD/YYYY or M/D/YYYY
    set "Day=%%B" & set "Month=%%A" & set "Year=%%C"
    rem For German date DD.MM.YYYY or English UK date DD/MM/YYYY
    rem set "Day=%%A" & set "Month=%%B" & set "Year=%%C"
)

if "%Month:~0,1%"  EQU "0" ( if "%Month:~1%"  NEQ "" set "Month=%Month:~1%"   )
if "%Day:~0,1%"    EQU "0" ( if "%Day:~1%"    NEQ "" set "Day=%Day:~1%"       )

set /A "Index1=Year-1979"
set /A "Index2=Index1-30"

if %Index1% LEQ 30 (
    for /F "tokens=%Index1% delims= " %%Y in ("3652 4018 4383 4748 5113 5479 5844 6209 6574 6940 7305 7670 8035 8401 8766 9131 9496 9862 10227 10592 10957 11323 11688 12053 12418 12784 13149 13514 13879 14245") do set "Days=%%Y"
    for /F "tokens=%Index1% delims= " %%L in ("Y N N N Y N N N Y N N N Y N N N Y N N N Y N N N Y N N N Y N") do set "LeapYear=%%L"
) else (
    for /F "tokens=%Index2% delims= " %%Y in ("14610 14975 15340 15706 16071 16436 16801 17167 17532 17897 18262 18628 18993 19358 19723 20089 20454 20819 21184 21550 21915 22280 22645 23011 23376 23741 24106 24472 24837") do set "Days=%%Y"
    for /F "tokens=%Index2% delims= " %%L in ("N N Y N N N Y N N N Y N N N Y N N N Y N N N Y N N N Y N N") do set "LeapYear=%%L"
)
if "%LeapYear%" == "N" (
    for /F "tokens=%Month% delims= " %%M in ("0 31 59 90 120 151 181 212 243 273 304 334") do set /A "Days+=%%M"
) else (
    for /F "tokens=%Month% delims= " %%M in ("0 31 60 91 121 152 182 213 244 274 305 335") do set /A "Days+=%%M"
)
set /A "Days+=Day-1"
set /A "Seconds=Days*86400"
goto :EOF

此批处理文件是my answer最喜欢的问题Batch file to delete files older than N days的变体,它会忽略时间并仅评估每个文件夹的日期。

如果环境变量 DATE 中的日期格式与%%~tD上命令 FOR 使用的日期格式不同,则需要调整环境的日期字符串变量

例如%DATE%扩展为Sun 02/08/2015%%~tD扩展为02/08/2015 09:29 PM,上述代码可用于修改第4行:

call :GetSeconds "%DATE:~4%"

这导致传递给子例程02/08/2015 - 没有工作日缩写的3个字母和分隔空格字符的日期字符串。

或者,可以在上面的代码中将以下内容用作第四行:

call :GetSeconds "%DATE:~-10%"

现在,日期字符串中的最后10个字符被传递给函数GetSeconds,因此环境变量 DATE 的日期字符串是否与工作日一样长,只要日期和时间无关紧要月份始终为预期顺序中的2位数,即格式为dd/mm/yyyydd.mm.yyyy