我需要一个批处理脚本,删除除两个文件之外的给定文件夹的子子文件夹中的所有文件。
我有一组子文件夹的名称,可以找到文件set sf=(sf0 sf1)
这些子文件夹嵌套在给定路径下的某处,例如
<givenPath>\something\anything\sf0
<givenPath>\whatever\sf1
在这些子文件夹中,我现在要删除除2之外的所有文件。
<givenPath>
中的所有其他文件和子文件夹必须保持不变。
我发现这可以通过以下方式实现:
for /R "%somePath%" %%D in (*.*) do (
if /I not "%%D"=="dontDelete.file" (
if /I not "%%D"=="hasToStay.file" (
echo del /S /Q "%somePath%\%%D"
)
)
)
我的问题是让%some_path%
指向正确的子文件夹,如上所述。
如何实现这一目标? 或者我完全错了,还有更好的方法吗?
答案 0 :(得分:0)
您可以递归搜索文件名并删除文件。
我没有删除子目录,因为如果你想保留目录,你的问题就不清楚了。
所有目录中的所有文件,除了两个文件&#34; file1&#34;和&#34; file2&#34;将被删除,目录将保留。如果要删除目录,请删除保留目录的第一个if循环。
@echo off
rem set your two file names in these variables
set file1="a.txt"
set file2="b.txt"
for /f "delims=" %%a in ('dir /s /b *.*') do (
if exist %%~sa\NUL (
echo It is a directory, not deleted: %%~sa
) else if "%%~nxa" == %file1% (
echo Not deleted : %file1%
) else if "%%~nxa" == %file2% (
echo Not deleted : %file2%
) else (
del /s /q "%%a"
)
)
答案 1 :(得分:0)
这将分两步完成工作
首先,生成完整的文件夹列表(在给定路径下)。此文件夹列表已过滤,不包含&#34;特殊&#34;文件夹。对于其余文件夹,将删除所有文件。
接下来,枚举所有剩余的文件(这是第一步的原因,如果没有必要不处理文件,只是文件夹,所以第二个列表更短)。此列表经过筛选,以排除任何&#34;特殊&#34;文件在&#34;特殊&#34;文件夹。其余文件将被删除。
@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
个操作他们内心。
删除操作仅回显给控制台。如果输出正确,请删除echo
命令前缀的del
此echo
测试命令使第二步找到第一步中尚未删除的所有文件(echo
)。如果没有删除第一步中的echo
,第二步就会更快,因为它必须处理更少的文件。
已编辑以适应评论 - 因为只应删除特殊文件夹中的非特殊文件
@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
with folderFilter)内的内容,并从剩余的文件列表中删除特殊文件({{ 1}} with fileFilter)。列表中的任何内容都将被删除
与前面的代码一样,findstr
操作仅回显到控制台。如果输出正确,请删除del
以删除文件。