繁体   English   中英

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

[英]Batch file to delete subfolders in directory if all files is older than 3 days

我需要完成我的批处理脚本。 我有一个路径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天而删除子文件夹。

我怎样才能做到这一点?

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

您可以检测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和其他地方发布了多种方法,展示了如何批量进行日期算术。 我偏向于一个名为getTimestamp.bat混合JScript /批处理实用程序 它是从XP开始在任何现代Windows机器上运行的纯脚本 - 不需要第三方可执行文件。 它充满了各种选项,允许您进行几乎任何您能想象到的日期计算。

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

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

这使用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%"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM