Batch file 批量删除除指定文件和目录外的所有文件和目录

Batch file 批量删除除指定文件和目录外的所有文件和目录,batch-file,cmd,Batch File,Cmd,我试图删除一个特定目录中的所有文件和目录,使用该目录中的bat文件。我已经看到在Linux上这样做没有问题,但在Windows命令环境中,这似乎是一件琐事 示例:\temp\1.bat keep\temp\special folder keep Inside\temp\包含除1.bat和特殊文件夹外我要删除的所有文件夹和文件 我尝试过递归命令,但它们会删除目录,或者删除所有文件并保留目录 例如: attrib +r "special directory" attrib +r "1.bat" er

我试图删除一个特定目录中的所有文件和目录,使用该目录中的bat文件。我已经看到在Linux上这样做没有问题,但在Windows命令环境中,这似乎是一件琐事

示例:\temp\1.bat keep\temp\special folder keep

Inside\temp\包含除1.bat和特殊文件夹外我要删除的所有文件夹和文件

我尝试过递归命令,但它们会删除目录,或者删除所有文件并保留目录

例如:

attrib +r "special directory"
attrib +r "1.bat"
erase /Q *.*
rd /s /q
attrib -r "1.bat"
但这会移除一切。如果我删除rd行,它会删除所有文件,而不是目录,并保留我需要的1.bat文件

我也试过:

for /d %%i in (".\*") do if /i not "%%i"=="special folder" rd /s /q "%%i"
但这也不行。除了特殊文件夹和1.bat文件外,我无法删除所有目录和文件


这可能吗?

以下批处理文件可用于此任务:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "TargetFolder=%~1"
if not defined TargetFolder set "TargetFolder=."
set "ExcludeBatchFile="
for %%I in ("%TargetFolder%\") do if "%%~dpI" == "%~dp0" set "ExcludeBatchFile=/C:"%~nx0""
for /F "eol=| delims=" %%I in ('dir "%TargetFolder%\" /AD /B 2^>nul ^| %SystemRoot%\System32\findstr.exe /I /L /V /X /C:"special folder"') do rd /S /Q "%TargetFolder%\%%I"
for /F "eol=| delims=" %%I in ('dir "%TargetFolder%\" /A-D /B 2^>nul ^| %SystemRoot%\System32\findstr.exe /I /L /V /X /C:"1.bat" %ExcludeBatchFile%') do del /A /F "%TargetFolder%\%%I"
endlocal
使用带有dir的for/F代替for/D来处理具有隐藏属性集的子目录。for/D忽略具有隐藏属性的子目录

此批处理文件在作为参数传递给批处理文件的目录上运行目录清理。如果批处理文件在没有任何参数的情况下启动,它将对当前目录进行清理

在删除当前目录或指定目标目录中的文件时,批处理文件在被删除时保护自身,并且批处理文件位于当前目录或指定目标目录中。但是,如果批处理文件存储在当前目录或指定目标目录的任何子目录中,则该批处理文件在被删除时不会自我保护

第二个命令行上可以指定多个/C:Directory Name参数,以排除目标文件夹中要由批处理文件删除的多个子文件夹

可以在第三个命令行上指定多个/C:File Name参数,以排除目标文件夹中要由批处理文件删除的多个文件

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

德尔/? 目录/? 回声/? endlocal/? findstr/? 对于/? 如果/? rd/? setlocal/?
阅读Microsoft关于的文章,了解2>nul和|的解释。当Windows命令解释器在执行命令之前处理这些命令行时,必须在这两个命令行上使用插入符号“^转义重定向运算符>”和|,以便在后台启动的单独命令进程中使用dir和findstr执行嵌入命令行使用%ComSpec%/c和指定的命令行。

以下批处理文件可用于此任务:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "TargetFolder=%~1"
if not defined TargetFolder set "TargetFolder=."
set "ExcludeBatchFile="
for %%I in ("%TargetFolder%\") do if "%%~dpI" == "%~dp0" set "ExcludeBatchFile=/C:"%~nx0""
for /F "eol=| delims=" %%I in ('dir "%TargetFolder%\" /AD /B 2^>nul ^| %SystemRoot%\System32\findstr.exe /I /L /V /X /C:"special folder"') do rd /S /Q "%TargetFolder%\%%I"
for /F "eol=| delims=" %%I in ('dir "%TargetFolder%\" /A-D /B 2^>nul ^| %SystemRoot%\System32\findstr.exe /I /L /V /X /C:"1.bat" %ExcludeBatchFile%') do del /A /F "%TargetFolder%\%%I"
endlocal
使用带有dir的for/F代替for/D来处理具有隐藏属性集的子目录。for/D忽略具有隐藏属性的子目录

此批处理文件在作为参数传递给批处理文件的目录上运行目录清理。如果批处理文件在没有任何参数的情况下启动,它将对当前目录进行清理

在删除当前目录或指定目标目录中的文件时,批处理文件在被删除时保护自身,并且批处理文件位于当前目录或指定目标目录中。但是,如果批处理文件存储在当前目录或指定目标目录的任何子目录中,则该批处理文件在被删除时不会自我保护

第二个命令行上可以指定多个/C:Directory Name参数,以排除目标文件夹中要由批处理文件删除的多个子文件夹

可以在第三个命令行上指定多个/C:File Name参数,以排除目标文件夹中要由批处理文件删除的多个文件

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

德尔/? 目录/? 回声/? endlocal/? findstr/? 对于/? 如果/? rd/? setlocal/? 阅读Microsoft关于的文章,了解2>nul和|的解释。当Windows命令解释器在执行命令之前处理这些命令行时,必须在这两个命令行上使用插入符号“^转义重定向运算符>”和|,以便在后台启动的单独命令进程中使用dir和findstr执行嵌入命令行使用%ComSpec%/c和指定的命令行。

@ECHO OFF SETLOCAL 设置sourcedir=U:\sourcedir 设置keepfile=1.bat SET keepdir=留住我 对于%sourcedir%\*中的/d%%a,如果/i不%%nxa==%keepdir%RD/S/Q%%a,则执行 对于%sourcedir%\*中的%%a,如果/i不%%nxa==%keepfile%DEL%%a,则执行该操作 后藤:EOF 您需要更改设置 设置sourcedir、keepdir和keepfile以适应您的环境。清单使用了适合我的系统的设置

for/d命令处理所有目录,除了名称+扩展名与所需名称匹配的目录外,然后for对目标目录中的文件重复操作,删除除与所需文件名匹配的目录外的所有目录。

@ECHO OFF SETLOCAL 设置sourcedir=U:\sourcedir 设置keepfile=1.bat SET keepdir=留住我 对于%sourcedir%\*中的/d%%a,如果/i不%%nxa==%keepdir%RD/S/Q%%a,则执行 对于%sourcedir%\*中的%%a,如果/i不%%nxa==%keepfile%DEL%%a,则执行该操作 后藤:EOF 您需要更改sourcedir、keepdir和keepfile的设置以适应您的环境。清单使用了适合我的系统的设置


for/d命令处理所有目录,但如果name+扩展名与所需名称匹配,则for会对目标目录中的文件重复该操作,删除除与所需文件名匹配的文件外的所有文件。

查看并发布…我在发布之前尝试了所有这些。请特别注意,这是最灵活的变体,因为您可以通过路径或名称指定异常,对于文件/XF,您甚至可以使用通配符;当批处理脚本放在目标目录树中时,不要忘记将其自身排除在外…查看和发布…我在发布之前尝试了所有这些。请特别查看,这是最灵活的变体,因为您可以通过路径或名称指定异常,对于文件/XF,您甚至可以使用通配符;当批处理脚本放在目标目录树中时,不要忘记将其自身排除在外。。。