当前位置:  开发笔记 > 开发工具 > 正文

批处理文件,用于删除超过N天的文件

如何解决《批处理文件,用于删除超过N天的文件》经验,为你挑选了14个好方法。

我正在寻找一种方法来删除批处理文件中超过7天的所有文件.我在网上搜索过,发现了一些包含数百行代码的示例,还有一些需要安装额外的命令行实用程序才能完成任务.

只需几行代码就可以在BASH中完成类似的工作.对于Windows中的批处理文件,似乎至少可以轻松实现.我正在寻找一个在标准Windows命令提示符下工作的解决方案,没有任何额外的实用程序.请不要使用PowerShell或Cygwin.



1> aku..:

请享用:

forfiles -p "C:\what\ever" -s -m *.* -d  -c "cmd /c del @path"

有关详细信息,请参阅forfile文档.

有关更多好处,请参阅Windows XP命令行的AZ指数.

如果您forfiles的计算机上尚未安装,请将其从任何Windows Server 2003复制到Windows XP计算机上forfiles.这是可能的,因为EXE在Windows Server 2003和Windows XP之间完全兼容.

Windows和Windows Server的更高版本默认安装它.

对于Windows 7及更高版本(包括Windows 10):

语法已经改变了一点.因此更新的命令是:

forfiles /p "C:\what\ever" /s /m *.* /D - /C "cmd /c del @path"


请注意,如果您希望文件OLDER超过10天,则需要指定-d"-10".-ve表示"早于",+ ve表示"比"更新".您还可以将DDMMYY或-DDMMYY格式指定为-d的参数.
我在Win Server 2008上使用了这种语法:forfiles/P"C:\ Mysql_backup"/ S/M*.sql/D -30/C"cmd/c del @PATH"
@Russell:@PATH是完整的路径,包括名称.@FILE只是名称,因此如果您正在处理子文件夹,它将无法正常工作.
那么你每天都学到新的东西......以前从未遇到过forfiles :-)
应该是del @FILE,案例问题另外我建议使用/ c echo @FILE进行测试
还添加ECHO"Y"帮助你确定吗?像这样的消息:"cmd/c echo"Y"| del @PATH"结尾
当"超过7天"定义为"超过7天前修改"而不是"超过7天前创建"时,此答案有效.如何实现后者?
嗯...为什么这个答案发布了该命令行的"更新"版本,但仍然在该"更新"版本的大约一半命令行开关中使用*old*语法?Windows`forfiles`中命令行开关的官方语法以`/`开头,而不是`-`.另外,那里的`*.*`searchmask是什么?这会将范围限制为名称中带有"."的文件.为什么?OP从未提出过这样的要求.`forfiles`的默认搜索掩码是`*`,看起来OP需要的确是这样.这意味着根本不需要`/ M`参数.
请记住,天数应为负数,例如/ d -10将在10天之前删除所有内容.正值几乎没有任何意义.
我已经调整了此命令以使用MOVE而不是DEL将旧文件存档到另一个文件夹中http://www.computerhope.com/movehlp.htm
我没有看到有人提到你应该使用if @isdir == FALSE来处理文件,而不是文件夹.否则,您可能会意外删除文件夹中的所有文件.示例:forfiles -p"C:\ what\ever"-s -m*.*/D - <天数>/C"cmd/c如果@ isdir == FALSE del @path"
避免出现“您确定”消息的另一种方法是`del / F / Q @ path`-参见http://stackoverflow.com/questions/7160342#7160366。

2> 小智..:

运行以下命令:

ROBOCOPY C:\source C:\destination /mov /minage:7
del C:\destination /q

移动所有文件(使用/ mov,移动文件,然后删除它们而不是/ move移动整个文件树点然后删除)通过robocopy到另一个位置,然后在该路径上执行删除命令,你就是全部好.

此外,如果您有一个包含大量数据的目录,则可以使用/mirswitch


此外,robocopy确实支持UNC路径 - 从接受的答案中"forfiles"不会这样做.
@ adamb0mb这绝不是不切实际的 - 如果*"destination"*与*"source"*在同一文件系统上,则移动操作非常轻量级.由于robocopy非常强大,它实际上适用于任何目录大小,模糊的文件名,基本上任意的路径长度,并且如果你需要它还包含目录 - 对于许多其他Windows实用程序肯定无法说明.我会使用`rd/s/qc:\ destination`而不是`del`命令,或者甚至使用另一个`robocopy/mir c:\ emptydir c:\ destination`运行来清空目录,如果你预计文件名有问题的话.
在大多数情况下,这是一个相当不切实际的答案.如果我有一个包含大量数据的目录,那么将无法正常工作.我会选择其中一个"就地"的答案
我的想法更多的是:"我的文件已经是我想要的了.我不想移动它们." "删除文件在逻辑上就是你正在做的事情,所以这样做.不要让Robocopy过载这样做"
我建议这个单行程序用于查看超过7天的`C:\ test`中的所有文件.要删除文件,请将`echo`更改为`del`:`forfiles/p"C:\ test"/ m"*.*"/ c"cmd/c echo @file"/ D -7`

3> Jay..:

Ok感到无聊并想出了这个,其中包含了我的版本的穷人的Linux纪元更换,仅限于日常使用(没有时间保留):

7daysclean.cmd

@echo off
setlocal ENABLEDELAYEDEXPANSION
set day=86400
set /a year=day*365
set /a strip=day*7
set dSource=C:\temp

call :epoch %date%
set /a slice=epoch-strip

for /f "delims=" %%f in ('dir /a-d-h-s /b /s %dSource%') do (
    call :epoch %%~tf
    if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^)
)
exit /b 0

rem Args[1]: Year-Month-Day
:epoch
    setlocal ENABLEDELAYEDEXPANSION
    for /f "tokens=1,2,3 delims=-" %%d in ('echo %1') do set Years=%%d& set Months=%%e& set Days=%%f
    if "!Months:~0,1!"=="0" set Months=!Months:~1,1!
    if "!Days:~0,1!"=="0" set Days=!Days:~1,1!
    set /a Days=Days*day
    set /a _months=0
    set i=1&& for %%m in (31 28 31 30 31 30 31 31 30 31 30 31) do if !i! LSS !Months! (set /a _months=!_months! + %%m*day&& set /a i+=1)
    set /a Months=!_months!
    set /a Years=(Years-1970)*year
    set /a Epoch=Years+Months+Days
    endlocal& set Epoch=%Epoch%
    exit /b 0

用法

set /a strip=day*7:将保留天数更改为7.

set dSource=C:\temp :这是检查文件的起始目录.

笔记

这是非破坏性代码,它将显示将要发生的事情.

变化:

if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^)

类似于:

if !epoch! LEQ %slice% del /f %%f

所以文件实际上被删除了

2月:硬编码为28天.真的,Bissextile年是一个地狱.如果有人有想法不会添加10行代码,请继续发布,然后将其添加到我的代码中.

epoch:我没有花时间考虑,因为需要删除早于某个日期的文件,花费数小时/分钟就会删除一天中用于保存的文件.

局限性

epoch理所当然地认为您的短日期格式是YYYY-MM-DD.它需要适用于其他设置或运行时评估(读取sShortTime,用户绑定配置,在过滤器中配置正确的字段顺序,并使用过滤器从参数中提取正确的数据).

我提到我讨厌这个编辑器的自动格式吗?它删除了空行,复制粘贴是一个地狱.

我希望这有帮助.


很晚,完全没有关系,但是`7daysclean.cmd`听起来像Synth-Punk乐队的一个很棒的名字.
对于非破坏性代码+1,当我自己提供代码示例时,我会尽量记住这一点.

4> 小智..:
forfiles /p "v:" /s /m *.* /d -3 /c "cmd /c del @path"

你应该做/d -3(3天前)这对我来说很好.因此,所有复杂的批次都可能在垃圾桶中.同时forfiles不支持UNC路径,因此进行网络连接到特定的驱动器.


与其他答案(包括已接受的答案)相同的错误.指定`*.*`的这种奇怪习惯来自哪里?通配符`*.*`与Windows中的所有文件都不匹配.它只匹配名称中带有`.`的文件.OP从未说过在文件名中要求`.`的任何内容.正确的参数是`/ M*`,但无论如何这是默认值.根本不需要`/ M`.

5> e.James..:

看看我的回答到一个类似的问题:

REM del_old.bat
REM usage: del_old MM-DD-YYY
for /f "tokens=*" %%a IN ('xcopy *.* /d:%1 /L /I null') do if exist %%~nxa echo %%~nxa >> FILES_TO_KEEP.TXT
for /f "tokens=*" %%a IN ('xcopy *.* /L /I /EXCLUDE:FILES_TO_KEEP.TXT null') do if exist "%%~nxa" del "%%~nxa"

这将删除早于给定日期的文件.我确信它可以修改为从当前日期开始七天.

更新:我注意到HerbCSO对上述脚本进行了改进.我推荐使用他的版本.



6> 小智..:

我的命令是

forfiles -p "d:\logs" -s -m*.log -d-15 -c"cmd /c del @PATH\@FILE" 

@PATH - 在我的情况下只是路径,所以我不得不使用 @PATH\@FILE

forfiles /?不会为我工作过,但forfiles(没有"?")工作的罚款.

我唯一的问题是:如何添加多个掩码(例如" .log | .bak")?

所有这些关于我在这里下载的 forfiles.exe (在win XP上)

但是,如果您使用Windows服务器forfiles.exe应该已经存在并且它与ftp版本不同.这就是我应该修改命令的原因.

对于Windows Server 2003,我使用此命令:

forfiles -p "d:\Backup" -s -m *.log -d -15 -c "cmd /c del @PATH"



7> 小智..:

复制此代码并将其另存为DelOldFiles.vbs.

仅在命令提示中使用:cscript DelOldFiles.vbs 15

15表示删除过去15天以上的文件.

  'copy from here
    Function DeleteOlderFiles(whichfolder)
       Dim fso, f, f1, fc, n, ThresholdDate
       Set fso = CreateObject("Scripting.FileSystemObject")
       Set f = fso.GetFolder(whichfolder)
       Set fc = f.Files
       Set objArgs = WScript.Arguments
       n = 0
       If objArgs.Count=0 Then
           howmuchdaysinpast = 0
       Else
           howmuchdaysinpast = -objArgs(0)
       End If
       ThresholdDate = DateAdd("d", howmuchdaysinpast, Date)   
       For Each f1 in fc
     If f1.DateLastModified



8> NotJustClark..:

对于Windows Server 2008 R2:

forfiles /P c:\sql_backups\ /S /M *.sql /D -90 /C "cmd /c del @PATH"

这将删除超过90天的所有.sql文件.



9> Aidan Ewen..:

使用forfiles.

有不同的版本.早期使用unix样式参数.

我的版本(对于服务器2000 - 切换后没有空格) -

forfiles -p"C:\what\ever" -s -m*.* -d -c"cmd /c del @path"

要向XP添加forfiles,请从ftp://ftp.microsoft.com/ResKit/y2kfix/x86/获取exe文件

并将其添加到C:\ WINDOWS\system32


@Kibbee它的答案不一样,语法不同.这是一个帮助的天才尝试.知道很少的Windows命令行,我花了几个小时的挫折让这个工作.对我来说,关键信息是事实上有不同的版本(语法不同),我需要删除空格.原始答案中都没有包含这些内容.(我会对答案发表评论,但我没有特权

10> Mofi..:

通常有与批处理文件相关的相对日期/时间相关问题.但命令行解释程序cmd.exe没有日期/时间计算功能.已经在此处,Stack Overflow的其他页面和其他网站上发布了许多使用其他控制台应用程序或脚本的良好工作解决方案.

基于日期/时间的操作的共同点是要求将日期/时间字符串转换为自确定日期以来的秒数.很常见的是1970-01-01 00:00:00 UTC.但是,根据支持特定任务所需的日期范围,也可以使用任何后续日期.

Jay发布了7daysclean.cmd,其中包含命令行解释器cmd.exe的快速"日期到秒"解决方案.但它并没有将闰年考虑在内.JR发布了一个附加项目,用于考虑当年的闰日,但忽略了自基准年以来的其他闰年,即自1970年以来.

我使用20年来使用一个小C函数创建一次的静态表(数组),用于快速获取包含在C/C++编写的应用程序中日期/时间转换函数中1970-01-01的闰日的天数.

这种非常快速的表方法也可以在使用FOR命令的批处理代码中使用.因此,我决定编写批处理子例程GetSeconds,该子例程计算自1970-01-01 00:00:00 UTC以来传递给此例程的日期/时间字符串的秒数.

注意:不考虑闰秒,因为Windows文件系统也不支持闰秒.

首先,表格:

    自1970-01-01 00:00:00 UTC以来的每一天,包括闰日.

    1970 - 1979:     0   365   730  1096  1461  1826  2191  2557  2922  3287
    1980 - 1989:  3652  4018  4383  4748  5113  5479  5844  6209  6574  6940
    1990 - 1999:  7305  7670  8035  8401  8766  9131  9496  9862 10227 10592
    2000 - 2009: 10957 11323 11688 12053 12418 12784 13149 13514 13879 14245
    2010 - 2019: 14610 14975 15340 15706 16071 16436 16801 17167 17532 17897
    2020 - 2029: 18262 18628 18993 19358 19723 20089 20454 20819 21184 21550
    2030 - 2039: 21915 22280 22645 23011 23376 23741 24106 24472 24837 25202
    2040 - 2049: 25567 25933 26298 26663 27028 27394 27759 28124 28489 28855
    2050 - 2059: 29220 29585 29950 30316 30681 31046 31411 31777 32142 32507
    2060 - 2069: 32872 33238 33603 33968 34333 34699 35064 35429 35794 36160
    2070 - 2079: 36525 36890 37255 37621 37986 38351 38716 39082 39447 39812
    2080 - 2089: 40177 40543 40908 41273 41638 42004 42369 42734 43099 43465
    2090 - 2099: 43830 44195 44560 44926 45291 45656 46021 46387 46752 47117
    2100 - 2106: 47482 47847 48212 48577 48942 49308 49673
    

    使用无符号的32位变量(即C/C++中的无符号长整数(或无符号整数)),只能使用1970-01-01开始计算年份2039到2106的秒数.

    cmd.exe用于数学表达式的带符号32位变量.因此最大值为2147483647(0x7FFFFFFF),即2038-01-19 03:14:07.

    闰年信息(否/是)1970年至2106年.

    1970 - 1989: N N Y N N N Y N N N Y N N N Y N N N Y N
    1990 - 2009: N N Y N N N Y N N N Y N N N Y N N N Y N
    2010 - 2029: N N Y N N N Y N N N Y N N N Y N N N Y N
    2030 - 2049: N N Y N N N Y N N N Y N N N Y N N N Y N
    2050 - 2069: N N Y N N N Y N N N Y N N N Y N N N Y N
    2070 - 2089: N N Y N N N Y N N N Y N N N Y N N N Y N
    2090 - 2106: N N Y N N N Y N N N N N N N Y N N
                                     ^ year 2100
    

    当年每月第一天的天数.

                       Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
    Year with 365 days:  0  31  59  90 120 151 181 212 243 273 304 334
    Year with 366 days:  0  31  60  91 121 152 182 213 244 274 305 335
    

使用这些表格将日期转换为1970-01-01以来的秒数非常简单.

请注意!

日期和时间字符串的格式取决于Windows区域和语言设置.分配给环境变量的分隔符和令牌的顺序Day,Month以及Year在第一个FOR循环中GetSeconds必须根据需要调整为本地日期/时间格式.

如果环境变量DATE中的日期格式与命令FOR on 使用的日期格式不同,则必须调整环境变量的日期字符串%%~tF.

例如,当%DATE%扩展到Sun 02/08/2015同时%%~tF膨胀到02/08/2015 07:38 PM下面可以用修改线4所采用的代码:

call :GetSeconds "%DATE:~4% %TIME%"

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

或者,可以使用以下格式以正确的格式传递当前日期:

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

现在,日期字符串中的最后10个字符被传递给函数GetSeconds,因此无论环境变量DATE的日期字符串是否有工作日都没关系,只要日期和月份总是以预期顺序的2位数,即格式dd/mm/yyyydd.mm.yyyy.

这是批处理代码,用于解释注释,只输出要删除的文件和保存在C:\Temp文件夹树中的文件,请参阅第一个FOR循环的代码.

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

rem For each file in each subdirectory of C:\Temp get last modification date
rem (without seconds -> append second 0) and determine the number of seconds
rem since 1970-01-01 for this date/time. The file can be deleted if seconds
rem value is lower than the value calculated above.

for /F "delims=" %%F in ('dir /A-D-H-S /B /S "C:\Temp"') do (
    call :GetSeconds "%%~tF:0"
    rem if !Seconds! LSS %LastWeek% del /F "%%~fF"
    if !Seconds! LEQ %LastWeek% (
        echo Delete "%%~fF"
    ) else (
        echo Keep   "%%~fF"
    )
)
endlocal
goto :EOF


rem No validation is made for best performance. So make sure that date
rem and hour in string is in a format supported by the code below like
rem MM/DD/YYYY hh:mm:ss or M/D/YYYY h:m:s for English US date/time.

:GetSeconds

rem If there is " AM" or " PM" in time string because of using 12 hour
rem time format, remove those 2 strings and in case of " PM" remember
rem that 12 hours must be added to the hour depending on hour value.

set "DateTime=%~1"
set "Add12Hours=0"
if "%DateTime: AM=%" NEQ "%DateTime%" (
    set "DateTime=%DateTime: AM=%"
) else if "%DateTime: PM=%" NEQ "%DateTime%" (
    set "DateTime=%DateTime: PM=%"
    set "Add12Hours=1"
)

rem Get year, month, day, hour, minute and second from first parameter.

for /F "tokens=1-6 delims=,-./: " %%A in ("%DateTime%") 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"
    set "Hour=%%D" & set "Minute=%%E" & set "Second=%%F"
)
rem echo Date/time is: %Year%-%Month%-%Day% %Hour%:%Minute%:%Second%

rem Remove leading zeros from the date/time values or calculation could be wrong.
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%"       )
if "%Hour:~0,1%"   EQU "0" ( if "%Hour:~1%"   NEQ "" set "Hour=%Hour:~1%"     )
if "%Minute:~0,1%" EQU "0" ( if "%Minute:~1%" NEQ "" set "Minute=%Minute:~1%" )
if "%Second:~0,1%" EQU "0" ( if "%Second:~1%" NEQ "" set "Second=%Second:~1%" )

rem Add 12 hours for time range 01:00:00 PM to 11:59:59 PM,
rem but keep the hour as is for 12:00:00 PM to 12:59:59 PM.
if "%Add12Hours%" == "1" (
    if %Hour% LSS 12 set /A Hour+=12
)
set "DateTime="
set "Add12Hours="

rem Must use 2 arrays as more than 31 tokens are not supported
rem by command line interpreter cmd.exe respectively command FOR.
set /A "Index1=Year-1979"
set /A "Index2=Index1-30"

if %Index1% LEQ 30 (
    rem Get number of days to year for the years 1980 to 2009.
    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 (
    rem Get number of days to year for the years 2010 to 2038.
    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"
)

rem Add the days to month in year.
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"
)

rem Add the complete days in month of year.
set /A "Days+=Day-1"

rem Calculate the seconds which is easy now.
set /A "Seconds=Days*86400+Hour*3600+Minute*60+Second"

rem Exit this subroutine
goto :EOF

为了获得最佳性能,最好删除所有注释,即在0-4前导空格后以rem开头的所有行.

并且阵列也可以做得更小,即减少从1980-01-01 00:00:00到2038-01-19 03:14:07的时间范围,如上面的批处理代码目前所支持的那样,例如2015-01 -01到2019-12-31,如下面的代码所用,它真正删除了文件C:\Temp夹树中超过7天的文件.

此外,下面的批次代码针对24小时时间格式进行了优化.

@echo off
setlocal EnableDelayedExpansion
call :GetSeconds "%DATE:~-10% %TIME%"
set /A "LastWeek=Seconds-7*86400"

for /F "delims=" %%F in ('dir /A-D-H-S /B /S "C:\Temp"') do (
    call :GetSeconds "%%~tF:0"
    if !Seconds! LSS %LastWeek% del /F "%%~fF"
)
endlocal
goto :EOF

:GetSeconds
for /F "tokens=1-6 delims=,-./: " %%A in ("%~1") do (
    set "Day=%%B" & set "Month=%%A" & set "Year=%%C"
    set "Hour=%%D" & set "Minute=%%E" & set "Second=%%F"
)
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%"       )
if "%Hour:~0,1%"   EQU "0" ( if "%Hour:~1%"   NEQ "" set "Hour=%Hour:~1%"     )
if "%Minute:~0,1%" EQU "0" ( if "%Minute:~1%" NEQ "" set "Minute=%Minute:~1%" )
if "%Second:~0,1%" EQU "0" ( if "%Second:~1%" NEQ "" set "Second=%Second:~1%" )
set /A "Index=Year-2014"
for /F "tokens=%Index% delims= " %%Y in ("16436 16801 17167 17532 17897") do set "Days=%%Y"
for /F "tokens=%Index% delims= " %%L in ("N Y N 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+Hour*3600+Minute*60+Second"
goto :EOF

有关Windows上的日期和时间格式以及文件时间比较的更多信息,请参阅我的答案在批处理文件中查找文件是否超过4小时,以及有关文件时间的大量其他信息.



11> 小智..:

对于Windows 2012 R2,以下方法可行:

    forfiles /p "c:\FOLDERpath" /d -30 /c "cmd /c del @path"

查看将被删除的文件使用此

    forfiles /p "c:\FOLDERpath" /d -30 /c "cmd /c echo @path @fdate"



12> 小智..:

7daysclean.cmd上的这个修改如何考虑到闰年?

它可以在不到10行编码中完成!

set /a Leap=0
if (Month GEQ 2 and ((Years%4 EQL 0 and Years%100 NEQ 0) or Years%400 EQL 0)) set /a Leap=day
set /a Months=!_months!+Leap

由Mofi编辑:

由于语法无效,JR提供的上述条件总是为false.

并且Month GEQ 2也是错误的,因为在闰年中仅需要在3月到12月期间再增加86400秒,而不是2月份.

在Jay发布的批处理文件7daysclean.cmd中,将闰日考虑在内的工作代码 - 仅在当前年度 - 将是:

set "LeapDaySecs=0"
if %Month% LEQ 2 goto CalcMonths
set /a "LeapRule=Years%%4"
if %LeapRule% NEQ 0 goto CalcMonths
rem The other 2 rules can be ignored up to year 2100.
set /A "LeapDaySecs=day"
:CalcMonths
set /a Months=!_months!+LeapDaySecs



13> Graham Laigh..:

IMO,JavaScript逐渐成为一种通用的脚本标准:它可能在比其他任何脚本语言更多的产品中可用(在Windows中,它可以使用Windows脚本主机).我必须清理许多文件夹中的旧文件,所以这里有一个JavaScript函数:

// run from an administrator command prompt (or from task scheduler with full rights):  wscript jscript.js
// debug with:   wscript /d /x jscript.js

var fs = WScript.CreateObject("Scripting.FileSystemObject");

clearFolder('C:\\temp\\cleanup');

function clearFolder(folderPath)
{
    // calculate date 3 days ago
    var dateNow = new Date();
    var dateTest = new Date();
    dateTest.setDate(dateNow.getDate() - 3);

    var folder = fs.GetFolder(folderPath);
    var files = folder.Files;

    for( var it = new Enumerator(files); !it.atEnd(); it.moveNext() )
    {
        var file = it.item();

        if( file.DateLastModified < dateTest)
        {
            var filename = file.name;
            var ext = filename.split('.').pop().toLowerCase();

            if (ext != 'exe' && ext != 'dll')
            {
                file.Delete(true);
            }
        }
    }

    var subfolders = new Enumerator(folder.SubFolders);
    for (; !subfolders.atEnd(); subfolders.moveNext())
    {
        clearFolder(subfolders.item().Path);
    }
}

对于要清除的每个文件夹,只需向clearFolder()函数添加另一个调用.此特定代码还保留exe和dll文件,并清理子文件夹.



14> Sting..:

我可能会对这个已经有价值的线程做出微不足道的贡献。我发现其他解决方案可能会摆脱实际的错误文本,但忽略了%ERRORLEVEL%,这表明我的应用程序失败。并且我合理地希望%ERRORLEVEL%,只要它不是“找不到文件”错误即可。

一些例子:

专门调试和消除错误:

forfiles /p "[file path...]\IDOC_ARCHIVE" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&ECHO found error||echo found success

使用oneliner返回ERRORLEVEL成功或失败:

forfiles /p "[file path...]\IDOC_ARCHIVE" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&EXIT /B 1||EXIT /B 0

使用oneliner将ERRORLEVEL保持为零,以便在其他代码中间的批处理文件上下文中成功执行(ver> nul会重置ERRORLEVEL):

forfiles /p "[file path...]\IDOC_ARCHIVE" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&ECHO found error||ver > nul

对于SQL Server代理CmdExec作业,我进入以下步骤。我不知道这是否是一个错误,但是该步骤中的CmdExec只识别第一行代码:

cmd /e:on /c "forfiles /p "C:\SQLADMIN\MAINTREPORTS\SQL2" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&EXIT 1||EXIT 0"&exit %errorlevel%

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有