我最终想出了以下脚本来解决我的问题。我用FOR循环替换了FORFILES,遍历每个目录,然后在每个目录中使用FORFILES。这样一来,FORFILES就不必在子文件夹中搜索了。下面的脚本遍历每个文件夹(包括子文件夹),然后删除文件,并包含大量详细信息。
@ECHO OFF
CLS
SETLOCAL EnableDelayedExpansion EnableExtensions
SET "MINDAYSOLD=9"
SET "TARGETPATH=E:\archives"
SET "PADDEDTIME=%TIME: =0%"
SET "DATESTAMP=%DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%"
SET "LOGFILEPATH=Logs\%~n0-%DATESTAMP%.log"
SET "WORKINGDIR=%~dp0"
CALL :CreateDirectory "%WORKINGDIR%Logs"
ECHO Wiping files that are %MINDAYSOLD% or more days old...
ECHO Target Path: "%TARGETPATH%"
ECHO.
FOR /F "usebackq delims=" %%a IN (
`DIR "%TARGETPATH%" /S /B /AD /O:N`
) DO (
ECHO Searching folder: %%~a
FOR /F "usebackq delims=" %%b IN (
`forfiles /p "%%~a" /S /M *.* /D -%MINDAYSOLD% /C "cmd /C ECHO @path" 2^>nul`
) DO (
SET "filepath=%%~b"
SET "filename=%%~nxb"
ECHO Found !filepath!
ECHO Deleting !filename!
DEL /F /Q /A "!filepath!"
REM TIMEOUT /NOBREAK /T 1
IF EXIST "!filepath!" (
ECHO Error deleting file^^!
) ELSE (
ECHO Success.
)
)
ECHO Checking if folder %%~a is empty...
SET "filesearch="
FOR /F "usebackq delims=" %%c IN (
`DIR /B /A-D "%%~a" 2^>nul`
) DO (
SET "filesearch=%%c"
)
IF {!filesearch!}=={} (
ECHO Folder is empty, deleting folder...
RD /Q "%%~a"
REM TIMEOUT /NOBREAK /T 1
IF EXIST "%%~a" (
ECHO Error deleting folder^^!
) ELSE (
ECHO Success.
)
) ELSE (
ECHO Folder is NOT empty^^! Skipping deleting.
)
ECHO.
)
EXIT /B %ERRORLEVEL%
REM =================================================================
REM ! FUNCTIONS !
REM =================================================================
REM == Create directory =============================================
:CreateDirectory
IF NOT EXIST "%~1" (
MKDIR "%~1"
)
EXIT /B 0
REM =================================================================