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

10

我想使用一个批处理文件来删除特定目录中的所有文件和文件夹。我已经在Linux上看到过这样的操作,但在Windows命令环境下似乎很麻烦。

例如:\temp\1.bat(保留)\temp\special文件夹(保留)

\temp\目录中包含我想要删除的所有文件和文件夹,除了1.bat和special文件夹。

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

例如:

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文件”以外的所有目录和文件。

这种情况是否可能呢?


请查看以下帖子:这个这个这个这个这个 - aschipfl
在发布之前,我尝试了所有这些。 - Jake J
请特别关注此答案,它是最灵活的变体,因为您可以通过路径或名称指定异常,并且对于文件(/XF),您甚至可以使用通配符;不要忘记在目标目录树中放置批处理脚本本身时将其排除在外... - aschipfl
2个回答

15
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "keepfile=1.bat"
SET "keepdir=keep me"

FOR /d %%a IN ("%sourcedir%\*") DO IF /i NOT "%%~nxa"=="%keepdir%" RD /S /Q "%%a"
FOR %%a IN ("%sourcedir%\*") DO IF /i NOT "%%~nxa"=="%keepfile%" DEL "%%a"

GOTO :EOF
你需要更改sourcedirkeepdirkeepfile的设置以适应你的情况。列表使用适合我的系统的设置。 for/d命令处理除了名称+扩展名与所需名称匹配的目录之外的所有目录,然后for在目标目录中重复操作,删除除符合所需保留文件名的文件之外的所有文件。

出现错误:%%a 在此处是意外的。 - Sahin
2
@Sahin 这需要作为批处理文件运行,而不是在提示符处输入。 - Magoo

1
以下的批处理文件可用于此任务:
@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

使用带有dirfor /F代替for /D来处理隐藏属性设置的子目录。 for /D会忽略带有隐藏属性的子目录。

该批处理文件在传递给批处理文件的目录上运行目录清理。如果批处理文件没有任何参数启动,则对当前目录进行清理。

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

可以在第二个FOR命令行中指定多个/C:"目录名称"参数,以排除要由批处理文件删除的目标文件夹中的多个子文件夹。

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

为了理解所使用的命令及其工作原理,请打开命令提示窗口,在那里执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • del /?
  • dir /?
  • echo /?
  • endlocal /?
  • findstr /?
  • for /?
  • if /?
  • rd /?
  • setlocal /?

阅读微软关于使用命令重定向运算符的文章,了解2>nul|。 重定向运算符>|必须在FOR命令行中都用脱字符^进行转义,以便在Windows命令解释器处理这些命令行之前将其解释为文字字符,然后执行FOR命令,该命令执行带有dirfindstr的嵌入式命令行,并使用%ComSpec% /c和指定的命令行启动后台中的单独命令进程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接