Batch file 批量删除除指定文件和目录外的所有文件和目录
我试图删除一个特定目录中的所有文件和目录,使用该目录中的bat文件。我已经看到在Linux上这样做没有问题,但在Windows命令环境中,这似乎是一件琐事 示例:\temp\1.bat keep\temp\special folder keep Inside\temp\包含除1.bat和特殊文件夹外我要删除的所有文件夹和文件 我尝试过递归命令,但它们会删除目录,或者删除所有文件并保留目录 例如: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
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,您甚至可以使用通配符;当批处理脚本放在目标目录树中时,不要忘记将其自身排除在外。。。