如果所有文件都超过3天,则批量文件删除目录中的子文件夹

时间:2013-09-12 13:01:28

标签: windows date batch-file

我需要完成我的批处理脚本。 我有一个路径C:\ Users \ Mahmo03S \ Shaban。在那条路径中有几个子文件夹,例如。 ANSYS。 在子文件夹Ansys中有更多子文件夹=它是一个foldertree。 如果文件夹和子文件夹中的每个文件都超过3天,我的批处理脚本需要删除Ansys文件夹。如果在过去3天内只修改了Ansyn中的一个文件,那么Ansys就不会发生任何事情。 我试图制作一个可靠的解决方案但是: 批处理文件删除Ansys目录中的子子文件夹,因为子文件夹中的文件自3天后未被修改。

我有3个批处理文件来完成任务。

Script.bat

@echo off
setlocal enableextensions
pushd C:\Users\Mahmo03S\Desktop\Shaban

set /p check="Select a date:" 
Rem When prompted with above line type the date 3 days ago.

forfiles /c "cmd /c (IF @isdir==TRUE call C:\Users\Mahmo03S\Desktop\Search.bat "@path" "%check%")"

popd

Search.bat

set del=TRUE
forfiles /p %1 /d -%2 /s /m * /c "cmd /c (IF @isdir ==TRUE call C:\Users\Mahmo03S\Desktop\DeleteFolders.bat "@path" "%check%" "%del%")"

DeleteFolders.bat

set del=FALSE
if %del%==FALSE (rmdir /S /Q %1)

问题是: 我在Ansys文件夹中有一个子文件夹(例如hello)。在hello文件夹中,每个文件都超过3天。该脚本删除它不应该执行的hello文件夹。如果文件夹中的每个文件都超过3天,它应该只删除Ansys。如果在过去3天内只在Ansys文件夹中修改了一个文件,则应删除Ansys文件夹中的任何内容。

我制作了批处理文件,因此如果每个文件都超过3天,它会删除Ansys文件夹。但它不应该仅仅因为其中的文件超过3天而删除子文件夹。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

可以使工作解决方案更加简单;)

您可以检测FORFILES是否打印了任何结果,并在没有打印任何内容时采取措施。

使用FOR / D迭代直接子文件夹。对于每个文件夹,运行FORFILES以查找截止日期或晚于截止日期的文件。如果您不必担心忽略文件夹,那么您可以根据FORFILES返回代码执行操作。但是你不希望基于一个新的空文件夹得到误报。您可以检测FORFILES是否使用FINDSTR打印任何文件名,如果没有打印则删除文件夹树。 FORFILES如果找到新文件夹仍会打印空行,因此您必须使用.搜索字符,而不是使用"^"搜索一行。

@echo off
setlocal disableDelayedExpansion
set "root=C:\Users\Mahmo03S\Shaban"
set /p "cutoff=Enter a cutoff date (mm/dd/yyyy): "
for /d %%F in ("%root%\*") do (
  2>nul forfiles /p "%%F" /d %cutoff% /s /c "cmd /c if @isdir==FALSE echo @file"
) | >nul 2>nul findstr . || rd /s /q "%%F"

StackOverflow和其他地方发布了多种方法,展示了如何批量进行日期算术。我偏爱hybrid JScript/batch utility called getTimestamp.bat。它是从XP开始在任何现代Windows机器上运行的纯脚本 - 不需要第三方可执行文件。它充满了各种选项,让您几乎可以进行任何您想象的日期计算。

假设getTimestamp.bat位于当前目录中,或者更好,位于PATH中的某个位置,则可以使用以下行来计算截止日期,而不是提示输入日期:

call gettimestamp -OD -3 -F {mm}/{dd}/{yyyy} -R cutoff

答案 1 :(得分:0)

这使用VBS脚本计算3天前的日期,然后使用xcopy检查是否有任何文件比这更小,如果没有文件小于3天,则应删除"C:\Users\Mahmo03S\Shaban\Ansys"文件夹和子目录。

3天是日期计算,而不是完全72小时。

没有经过测试。

@echo off
call :date today -3
echo mm-dd-yyyy 3 days ago was: %day%

xcopy "C:\Users\Mahmo03S\Shaban\Ansys\*.*" "%temp%\" /l /s /d:%day% |find ":" >nul

if %errorlevel% EQU 1 rd /s /q "C:\Users\Mahmo03S\Shaban\Ansys"

goto :EOF
:date
set date1=%1
set qty=%2
set separator=%~3
if /i "%date1%" EQU "TODAY" (set date1=now) else (set date1="%date1%")
echo >"%temp%\%~n0.vbs" s=DateAdd("d",%qty%,%date1%)
echo>>"%temp%\%~n0.vbs" WScript.Echo year(s)^&_
echo>>"%temp%\%~n0.vbs"         right(100+month(s),2)^&_
echo>>"%temp%\%~n0.vbs"         right(100+day(s),2)
for /f %%a in ('cscript //nologo "%temp%\%~n0.vbs"') do set result=%%a
del "%temp%\%~n0.vbs"
endlocal& set "YY=%result:~0,4%"&set "MM=%result:~4,2%"&set "DD=%result:~6,2%"
set "day=%MM%-%DD%-%YY%"