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

时间:2019-07-19 08:36:28

标签: batch-file cmd

我正在尝试使用该目录中的bat文件删除特定目录中的所有文件和目录。我已经看到在Linux上完成此操作没有问题,但是在Windows命令环境中,这似乎很麻烦。

示例:\ temp \ 1.bat(保持)\ temp \特殊文件夹(保持)

内部\ 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文件”之外,我根本无法删除所有目录和文件。

这有可能吗?

2 个答案:

答案 0 :(得分:0)

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

@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
使用带有for /F

dir代替for /D来处理具有隐藏属性集的子目录。 for /D会忽略具有隐藏属性的子目录。

此批处理文件在作为参数传递给批处理文件的目录上运行目录清除。如果启动批处理文件时不带任何参数,它将在当前目录上进行清理。

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

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

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

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

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

阅读有关Using Command Redirection Operators的Microsoft文章,以获取2>nul|的解释。重定向操作符>|必须在 FOR 命令行上都使用脱字符号^进行转义,以便在Windows命令解释器处理这些命令时将其解释为原义字符。在执行命令 FOR 之前的第几行,该命令在使用dir和指定命令行在后台启动的单独命令进程中,用findstr%ComSpec% /c执行嵌入式命令行。

答案 1 :(得分:0)

@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对目标目录中的文件重复操作,删除所有目录。匹配所需的保留文件名。