9

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

一个简单的事情是 rd 文件夹的名称,它可以工作,但我相信有比单独删除每个文件夹更好的方法......就像遍历所有文件夹的循环一样。

谢谢

编辑:澄清一下,我在 x 中有 y(需要删除的文件夹),它可以在 x 的任何子文件夹中,并且可以处于任何深度。我也在看答案,我可能需要一些时间才能接受任何答案。请多多包涵 :)

4

4 回答 4

9

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

@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实例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\
于 2012-05-01T15:09:59.110 回答
6
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命令用于循环遍历文件或变量的列表,选项很容易记住,仅目录递归。

于 2012-05-01T03:14:22.717 回答
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

上一个示例生成了一个包含 4 个名为 Y 的文件夹的列表,这些文件夹将被删除,但在第一个文件夹被删除后,其余三个名称不再存在,在尝试删除它们时会导致错误消息。我了解在您的情况下这是一种可能性。

为了解决这个问题,文件夹必须按自下而上的顺序删除,即最里面的文件夹必须先删除,最顶层的文件夹必须最后删除。实现这一点的方法是通过递归子程序

@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

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

于 2012-05-02T18:14:56.087 回答
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
于 2017-06-25T11:10:30.057 回答