Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如何在不使用forfiles的情况下删除所有超过N天的目录(和内容)?_Batch File - Fatal编程技术网

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

Batch file 如何在不使用forfiles的情况下删除所有超过N天的目录(和内容)?,batch-file,Batch File,我接着回答 是否有一种方法可以删除所有超过N天但不使用forfiles命令的文件夹(及其内容) 我的问题的原因是,我的机器有一个旧的DOS版本,可能没有命令forfiles这里有一个批处理文件,没有使用命令forfiles删除C:\Temprecursive中日期超过7天的所有文件夹 因此,它将在2015-02-08删除日期为2015-01-31的所有文件夹,同时保留日期为2015-02-01的所有文件夹 请注意 日期和时间字符串的格式取决于Windows语言设置。如有必要,必须将GetSeco

我接着回答

是否有一种方法可以删除所有超过N天但不使用
forfiles
命令的文件夹(及其内容)


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

这里有一个批处理文件,没有使用命令forfiles删除
C:\Temp
recursive中日期超过7天的所有文件夹

因此,它将在2015-02-08删除日期为2015-01-31的所有文件夹,同时保留日期为2015-02-01的所有文件夹

请注意

日期和时间字符串的格式取决于Windows语言设置。如有必要,必须将
GetSeconds
循环的第一个中分配给环境变量
Day
Month
Year
的分隔符和令牌顺序调整为本地日期/时间格式

注意:还有一个echo命令rd只输出要删除的文件夹echo必须在测试运行后删除,以进行验证,才能真正删除文件夹

@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem Get seconds since 1970-01-01 for current day.
call :GetSeconds "%DATE%"
rem Subtract seconds for eight 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 %%I in ("C:\Temp\*") do (
    call :GetSeconds "%%~tI"
    set "FullFolderName=%%I"
    setlocal EnableDelayedExpansion
    if !Seconds! LEQ %LastWeek% echo rd /S /Q "!FullFolderName!"
    endlocal
)
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%"  == "0" if not "%Month:~1%"  == "" set "Month=%Month:~1%"
if "%Day:~0,1%"    == "0" if not "%Day:~1%"    == "" 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
此批处理文件是“关于收藏夹问题”的变体,它忽略时间,只计算每个文件夹的日期

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

例如,使用
%DATE%
扩展到
Sun 2015年8月2日
,而
%%~tD
扩展到
02/08/2015年9:29 PM
时,上述代码可用于将第4行修改为:

call :GetSeconds "%DATE:~4%"
这导致只将日期字符串传递给子例程
02/08/2015
——该日期字符串不包含工作日缩写的3个字母和分隔空格字符

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

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

现在,日期字符串中的最后10个字符被传递给函数
GetSeconds
,因此环境变量date的日期字符串是否包含工作日并不重要,只要日期和月份总是按预期顺序包含两位数字,也就是说,在格式
dd/mm/yyyyy
dd.mm.yyyy

中,为什么要避免文件
?据我所知,唯一一个能够处理日期数学的本机Windows工具是
robocopy
。如果您也不能使用它,那么您可能必须使用vbscript/jscript或PowerShell。@rojo原因是我的机器有旧的DOS版本,可能没有文件命令。您真的有DOS版本还是旧的Windows版本?在这两种情况下,重要的是要知道哪个版本是“Microsoft Windows[version 5.2.3790]”,“For Files”将在那里工作@jebSo如果您有Windows Server 2003,那么您应该能够从资源工具包中安装forfiles