我正在尝试使用该目录中的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文件”之外,我根本无法删除所有目录和文件。
这有可能吗?
答案 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
您需要根据自己的情况更改sourcedir
,keepdir
和keepfile
的设置。清单使用适合我系统的设置。
for/d
命令处理所有目录,除非名称和扩展名与所需名称匹配,然后for
对目标目录中的文件重复操作,删除所有目录。匹配所需的保留文件名。