如何使用cmd / batch文件删除目录中名称x的所有文件夹

时间:2012-05-01 03:08:24

标签: batch-file cmd

我有一个名为x的文件夹,其中包含许多子文件夹和文件。我想删除x中存在的名为y的文件夹及其所有子文件夹。必须删除的所述文件夹可能包含也可能不包含任何文件。我相信我可以使用cmd或某种批处理文件来做到这一点,但我是命令行new bi并且可以真正使用一些帮助。

一个简单的事情就是找到文件夹的名称,这有用,但我相信有比单独删除每个文件夹更好的方法..就像一些遍历所有文件夹的循环。

由于

编辑:只是为了澄清,我有x(需要删除的文件夹)在x内部,它可以在任何x的子文件夹和任何深度级别。此外,我正在寻找答案,我可能需要一些时间来接受任何答案。请耐心等待:))

4 个答案:

答案 0 :(得分:7)

这是评论的另一个解决方案,用于描述脚本的每个部分:

@Echo OFF
REM Important that Delayed Expansion is Enabled
setlocal enabledelayedexpansion
REM This sets what folder the batch is looking for and the root in which it starts the search:
set /p foldername=Please enter the foldername you want to delete: 
set /p root=Please enter the root directory (ex: C:\TestFolder)
REM Checks each directory in the given root
FOR /R %root% %%A IN (.) DO (
    if '%%A'=='' goto end   
    REM Correctly parses info for executing the loop and RM functions
    set dir="%%A"
    set dir=!dir:.=!
    set directory=%%A
    set directory=!directory::=!
    set directory=!directory:\=;!   
    REM Checks each directory
    for /f "tokens=* delims=;" %%P in ("!directory!") do call :loop %%P
)
REM After each directory is checked the batch will allow you to see folders deleted.
:end
pause
endlocal
exit
REM This loop checks each folder inside the directory for the specified folder name. This allows you to check multiple nested directories.
:loop
if '%1'=='' goto endloop
if '%1'=='%foldername%' (
    rd /S /Q !dir!
    echo !dir! was deleted.
)
SHIFT
goto :loop
:endloop

您可以从初始变量前面取出/p,如果您不想被提示,只需在=之后输入值:

set foldername=
set root=

您还可以删除循环部分中的echo和结尾部分中的pause,以便批量静默运行。

它可能有点复杂,但代码可以应用于许多其他用途。

我测试了它在qwerty中寻找同一个foldername C:\Test的多个实例:

C:\Test\qwerty
C:\Test\qwerty\subfolder
C:\Test\test\qwerty
C:\Test\test\test\qwerty

剩下的就是:

C:\Test\
C:\Test\test\
C:\Test\test\test\

答案 1 :(得分:5)

FOR /D /R %%X IN (fileprefix*) DO RD /S /Q "%%X"

注意使用它......

用于RD命令:

/S      Removes all directories and files in the specified directory
        in addition to the directory itself.  Used to remove a directory
        tree.
/Q      Quiet mode, do not ask if ok to remove a directory tree with /S

FOR命令用于循环遍历文件或变量列表,选项很容易记忆,目录只能递归。

答案 2 :(得分:1)

此类主题的一个常见问题是,如果在多个级别存在目标文件夹的实例,则大多数方法都会导致错误,因为删除高级别文件夹时,其下面的所有文件夹都会消失。例如:

C:\X\Y\subfolder
C:\X\Y\subfolder\one\Y
C:\X\Y\subfolder\two\Y
C:\X\Y\subfolder\three\Y
C:\X\test
C:\X\test\test

上一个示例生成一个包含名为Y的4个文件夹的列表,这些文件夹将被删除,但在删除第一个文件夹后,其余三个名称将不再存在,从而在尝试删除时会出现错误消息。我知道这可能是你的情况。

要解决此问题,必须以自下而上的顺序删除文件夹,即必须先删除最里面的文件夹,最后删除顶级文件夹。实现此目的的方法是通过递归子例程

@echo off
rem Enter into top level folder, process it and go back to original folder
pushd x
call :processFolder
popd
goto :EOF

:processFolder
rem For each folder in this level
for /D %%a in (*) do (
   rem Enter into it, process it and go back to original
   cd %%a
   call :processFolder
   cd ..
   rem If is the target folder, delete it
   if /I "%%a" == "y" (
      rd /S /Q "%%a"
   )
)
exit /B

虽然在这种特殊情况下,其他方法引起的问题只是多个错误消息,但在其他情况下,此处理顺序是基本的。

答案 3 :(得分:0)

使用以下内容制作.bat:

del /q "C:\Users\XXX\AppData\Local\Temp\*"

FOR /D %%p IN ("C:\Users\XXX\AppData\Local\Temp\*.*") DO rmdir "%%p" /s /q