这将分两步完成
首先,生成一个完整的文件夹列表(在给定路径下)。此文件夹列表被过滤为不包含“特殊”文件夹。对于其余文件夹,所有文件都将被删除。
接下来,枚举所有剩余的文件(这是第一步的原因,如果没有必要不处理文件,只处理文件夹,所以第二个列表更短)。过滤此列表以排除“特殊”文件夹下的任何“特殊”文件。剩余文件被删除。
@echo off
setlocal enableextensions disabledelayedexpansion
rem configure starting path
set "givenPath=%cd%"
rem list of folders that need a special test
set "specialFolders="sf0" "sf1""
rem list of files to keep inside special folders
set "specialFiles="dontDelete.file" "hasToStay.file""
rem a temporary file will be needed
set "tempFile=%temp%\%~nx0.%random%.tmp"
rem STEP 1 - remove all files from non special folders
rem prepare temporary file to filter the list of folders
(for %%a in (%specialFolders%) do echo \%%~a) > "%tempFile%"
rem remove all files from not special folders
for /f "delims=" %%a in ('
dir /ad /s /b "%givenPath%" ^| findstr /i /v /e /l /g:"%tempFile%"
') do echo del /f /q "%%~fa\*"
rem STEP 2 - Delete all non special files from special folders
rem generate a temporay file to filter the list of files
(for %%a in (%specialFolders%) do for %%b in (%specialFiles%) do echo \%%~a\%%~b) > "%tempFile%"
rem remove any file not matching the special folder/files
for /f "delims=" %%a in ('
dir /a-d /s /b "%givenPath%" ^| findstr /i /v /e /l /g:"%tempFile%"
') do echo del /f /q "%%~fa"
rem remove temporary file
del /q "%tempFile%" >nul
可以删除第一步,结果是一样的,但不是对非特殊文件夹执行del操作,而是对其中的每个文件执行del操作。
删除操作仅回显到控制台。如果输出正确,则删除del 命令前缀的echo
这个echo 测试命令使第二步找到所有在第一步中没有被删除的文件(echo)。如果不删除第一步中的echo,第二步会更快,因为它需要处理的文件更少。
已编辑以适应 cmets - 因为只有特殊文件夹中的非特殊文件应该被删除
@echo off
setlocal enableextensions disabledelayedexpansion
rem configure starting path
set "givenPath=%cd%"
rem list of folders that need a special test
set "specialFolders="sf0" "sf1""
rem list of files to keep inside special folders
set "specialFiles="dontDelete.file" "hasToStay.file""
rem temporary files will be needed
set "folderFilter=%temp%\%~nx0.%random%.1.tmp"
set "fileFilter=%temp%\%~nx0.%random%.2.tmp"
rem prepare temporary file to filter the list of folders
(for %%a in (%specialFolders%) do echo \\%%~a\\[^^\\]*) > "%folderFilter%"
rem prepare temporary file to filter the list of files
(for %%a in (%specialFiles%) do echo \%%~a) > "%fileFilter%"
rem Search all files, filter and delete
for /f "delims=" %%a in ('
dir /s /b /a-d "%givenPath%"
^| findstr /i /e /r /g:"%folderFilter%"
^| findstr /i /e /l /v /g:"%fileFilter%"
') do echo del /f /q "%%~fa"
rem remove temporary files
del /q "%folderFilter%" > nul
del /q "%fileFilter%" > nul
检索完整的文件列表 (dir /s),从中删除任何不在特殊文件夹中的内容(findstr 使用 folderFilter),然后从剩余的文件列表中删除特殊文件(findstr 使用 fileFilter) .列表中的任何内容都将被删除
与前面的代码一样,del 操作仅回显到控制台。如果输出正确,请删除echo 以删除文件。