3

我需要完成我的批处理脚本。我有一个路径 C:\Users\Mahmo03S\Shaban。在该路径中有几个子文件夹,例如。安思。在子文件夹 Ansys 中有更多的子文件夹 = 它是一个文件夹树。如果文件夹和子文件夹中的每个文件都超过 3 天,我的批处理脚本需要删除 Ansys 文件夹。如果在过去 3 天内仅修改了 Ansyn 中的一个文件,则 Ansys 不会发生任何事情。我试图做出一个可靠的解决方案,但是:批处理文件删除了 Ansys 目录中的一个子子文件夹,因为子子文件夹中的文件自 3 天以来没有被修改。

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

脚本.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

搜索.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%")"

删除文件夹.bat

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

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

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

我怎样才能做到这一点?

4

2 回答 2

1

一个可行的解决方案可以变得更简单;)

您可以检测 FORFILES 是否打印了任何结果,如果没有打印任何结果,则采取措施。

使用 FOR /D 迭代直接子文件夹。对于每个文件夹,运行 FORFILES 以查找在截止日期或之后的文件。如果您不必担心忽略文件夹,那么您可以简单地根据 FORFILES 返回码采取行动。但是您不希望基于一个新的但空的文件夹得到误报。您可以使用 FINDSTR 检测 FORFILES 是否打印了任何文件名,如果没有打印,则删除文件夹树。如果 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. 它是从 XP 开始在任何现代 Windows 机器上运行的纯脚本 - 不需要 3rd 方可执行文件。它充满了各种选项,让您几乎可以进行任何您能想象到的日期计算。

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

call gettimestamp -OD -3 -F {mm}/{dd}/{yyyy} -R cutoff
于 2013-09-12T14:05:16.147 回答
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%"
于 2013-09-12T14:04:50.147 回答