【问题标题】:Batch file. Delete all files and folders in a directory批处理文件。删除目录中的所有文件和文件夹
【发布时间】:2011-10-13 18:34:54
【问题描述】:

我想要一个批处理文件,它将删除我的无线工具包缓存文件夹中的所有文件夹和文件。

目前我有以下:

cd "C:\Users\tbrollo\j2mewtk\2.5.2\appdb\RMS"
del *.db

这将删除我的 RMS 目录中的所有 .db 文件,但是我想删除该目录中的所有内容。我该怎么做?

【问题讨论】:

  • 在提示符处输入del /?。它将为您提供有关如何使用该工具的信息。对于这种情况,del *.* /s 可以工作但不要在错误的目录中这样做!
  • rmdir /s /q c:\users\tbrollo\j2mewtk\2.5.2\appdb\RMS
  • 我会建议根据投票来更改正确答案
  • forsvarir 的回答也删除了 RMS 目录,这可能不是预期的。 (事实上​​,这通常是我想要的,因为那样我会丢失目录的原始时间戳以及它拥有的任何权限。)请参阅我的答案以了解如何删除 a 的所有内容目录,但保留目录本身。

标签: batch-file batch-processing


【解决方案1】:

del *.* 而不是del *.db。这将删除所有内容。

【讨论】:

  • 注意:如果你想绕过“你确定要删除...”提示你需要添加/F Q标志:del . /F /Q
  • 这只会删除文件 - 而不是文件夹
  • 这不应被标记为正确答案,因为它不会删除文件夹(如问题中所述)。
【解决方案2】:

试试下面的;它对我有用。

我有一个将数据转储到我的“C:\tmp”文件夹中的应用程序,以下内容最适合我。它甚至不要求 YesNo 删除数据。我已经制定了它每 5 分钟运行一次的时间表

cd "C:\tmp"

del *.* /Q

【讨论】:

  • 如果文件夹“C:\tmp”不存在(如果您或其他应用程序已删除该文件夹)并且如果您尝试运行此文件夹,它不会从其他文件夹中删除数据在“C:\”内? (发生在我身上)
  • 正如维克拉姆所说:1)这非常危险,2)它不会像问题中所述删除子目录。
  • 除了文件夹之外......你可以只做del /q c:\tmp\*.*,这大约安全了一百万倍。更不用说cd 只会改变路径,不会改变驱动器。
  • 这是一个糟糕的建议。正如其他人所提到的,您最终可能会因此清除大量重要数据。标记为删除我认为这很糟糕。
【解决方案3】:
IF EXIST "C:\Users\tbrollo\j2mewtk\2.5.2\appdb\RMS" (
    rmdir "C:\Users\tbrollo\j2mewtk\2.5.2\appdb\RMS" /s /q
)

这将从文件夹(以及文件夹本身)中删除所有内容。

【讨论】:

  • 我认为问题是关于清空所有内容的目录,而不是删除目录本身。
【解决方案4】:

用途:

  • 创建批处理文件

  • 将以下文本复制到批处理文件中

    set folder="C:\test"
    cd /d %folder%
    for /F "delims=" %%i in ('dir /b') do (rmdir "%%i" /s/q || del "%%i" /s/q)
    

它将删除所有文件文件夹。

【讨论】:

  • 太棒了,我正在寻找一些东西来清理文件和文件夹以进行每月的批处理作业,这成功了。
  • 在执行此操作之前确保目录存在。
  • 如果文件名中有“特殊”字符,请先使用chcp 10000 将编码更改为 UTF-16
  • 只想在 Bill_Stewart 的评论中添加注释。您要确保该目录存在的原因是,否则,它将清除您当前所在的任何目录。在我的情况下,它是我已经处理了 30 多分钟的批处理文件。 :( 好在文件夹的其余部分都在源代码控制之下。
  • @vee 将循环更改为(rmdir "%%i" /s/q 2>NUL || del "%%i" /s/q >NUL ) 以抑制错误和删除消息
【解决方案5】:

更好的是,假设我想删除 C:\windows\temp 文件夹下的所有内容。

@echo off
rd C:\windows\temp /s /q

【讨论】:

  • 删除目录c:\windows\temp。我认为这不是最初的问题所要问的。
  • 删除目录对我来说似乎是最简单的,如果我之后需要重新创建它,我可以。一个问题可能是特殊文件夹权限的丢失。但是,这似乎比大多数其他答案容易
  • 可悲的是,从批处理脚本中删除并立即重新创建似乎会在 Win10 上给出随机的“拒绝访问”错误...
【解决方案6】:

del *.* 只会删除文件,不会删除子目录。要删除目录的内容,您可以使用以下脚本:

@echo off
setlocal enableextensions
if {%1}=={} goto :HELP
if {%1}=={/?} goto :HELP
goto :START

:HELP
echo Usage: %~n0 directory-name
echo.
echo Empties the contents of the specified directory,
echo WITHOUT CONFIRMATION. USE EXTREME CAUTION!
goto :DONE

:START
pushd %1 || goto :DONE
rd /q /s . 2> NUL
popd

:DONE
endlocal

pushd 更改为您要删除其子项的目录。那么当rd要求删除当前目录和所有子目录时,子目录删除成功,但当前目录删除失败——因为我们在里面。这会产生2> NUL 吞下的错误。 (2 是错误流)。

【讨论】:

  • 我对这究竟是如何工作的有点困惑,所以作为对其他人的解释:pushd 更改为您要删除子项的目录。那么当rd要求删除当前目录和所有子目录时,子目录删除成功,但是当前目录删除失败——因为我们在里面。这会产生 2> NUL 吞下的错误。 (2 是错误流)。非常狡猾的斯图尔特先生!
  • 哦,“setlocal enableextensions”开启了同时将当前目录推送到堆栈和更改目录的功能。这似乎只在 XP 之前是必需的,因为在那里和以后它都默认为 On。
  • 能否将来自 cmets 的信息整合到答案中(cmets 随时可能消失)? (Without using "Edit:""Update:" labels.)
  • 如果脚本执行为:foo.bat jack&jill,此代码将失败。 IF 命令的最佳实践:if "%~1"=="" goto :HELP。使用文件和文件夹路径的最佳实践。 PUSHD "%~1".
  • 实际上,您的命令将执行foo.bat jack,然后执行jill(因为您没有引用路径)。要将其作为路径传递,无论如何您都必须引用它(因此您不需要"%~1")。因此无需更改代码。
【解决方案7】:

您可以使用robocopy 将一个空文件夹镜像到您正在清除的文件夹。

robocopy "C:\temp\empty" "C:\temp\target" /E /MIR

如果您无法删除或重新创建实际文件夹,它也可以工作。

它确实需要一个现有的空目录。

【讨论】:

  • 根据 robocopy 的帮助,/MIR :: MIRror a directory tree (equivalent to /E plus /PURGE). - 所以我相当肯定/E 是多余的。
【解决方案8】:

我只是根据 morty346 发布的内容将这些放在一起:

set folder="C:\test"
IF EXIST "%folder%" (
    cd /d %folder%
    for /F "delims=" %%i in ('dir /b') do (rmdir "%%i" /s/q || del "%%i" /s/q)
)

它会先快速检查变量中定义的文件夹是否存在,将目录更改为文件夹,然后删除内容。

【讨论】:

  • 所以,快速提示 - 如果您尝试在网络路径上运行它,即使使用“IF EXIST”语句,它也会无法设置文件夹,并且会在 cmd 提示符中记录一条语句“UNC 路径不支持,默认为 windows 目录”然后它将尝试删除 windows 目录中的所有内容。所以要小心。
【解决方案9】:

您可以使用del/S 标志来执行此操作(告诉它递归所有子目录中的所有文件):

del /S C:\Path\to\directory\*

也可以使用RD 命令。无提示地递归删除:

@RD /S /Q %VAR_PATH%

Rmdir (rd)

【讨论】:

    【解决方案10】:
    set "DIR_TO_DELETE=your_path_to_the_folder"
    
    IF EXIST %DIR_TO_DELETE% (
        FOR /D %%p IN ("%DIR_TO_DELETE%\*.*") DO rmdir "%%p" /S /Q
        del %DIR_TO_DELETE%\*.* /F /Q
    )
    

    【讨论】:

      【解决方案11】:

      只是GregM's answer的修改版:

      set folder="C:\test"
      cd /D %folder%
      if NOT %errorlevel% == 0 (exit /b 1)
      echo Entire content of %cd% will be deleted. Press Ctrl-C to abort
      pause
      
      REM First the directories /ad option of dir
      for /F "delims=" %%i in ('dir /b /ad') do (echo rmdir "%%i" /s/q)
      
      REM Now the files /a-d option of dir
      for /F "delims=" %%i in ('dir /b /a-d') do (echo del "%%i" /q)
      
      REM To deactivate simulation mode remove the word 'echo' before 'rmdir' and 'del'.
      

      【讨论】:

        【解决方案12】:
        @echo off
        @color 0A
        
        echo Deleting logs
        
        rmdir /S/Q c:\log\
        
        ping 1.1.1.1 -n 5 -w 1000 > nul
        
        echo Adding log folder back
        
        md c:\log\
        

        你是在正确的轨道上。只需添加代码以重新添加被删除的文件夹。

        【讨论】:

        • 我不推荐此解决方案,因为它会删除目录(从而失去其权限)并重新创建它(可能具有不同的权限)。
        【解决方案13】:

        使用

        set dir="Your Folder Path Here"
        rmdir /s %dir%
        mkdir %dir%
        

        这个版本不问就删了:

        set dir="Your Folder Here"
        rmdir /s /q %dir%
        mkdir %dir%
        

        例子:

        set dir="C:\foo1\foo\foo\foo3"
        rmdir /s /q %dir%
        mkdir %dir%
        

        这将清除C:\foo1\foo\foo\foo3

        (我想提一下Abdullah Sabouin's answer。关于我抄袭他的事情有点混乱。我没有注意到他的帖子。我要感谢你melpomene指出错误!)

        【讨论】:

        • 那根本行不通。如果foo 不是空目录,则rmdir foo 会出错。
        • @melpomene 我发现了错误,应该修复它!!
        • 我无意以任何方式复制@Abdullah Sabouni。我一定没有注意到这一点。对不起。
        • @melpomene 我陈述了我的错误以及我对所发生事情的看法。但我决定不删除,以防它有帮助。感谢您指出这一点。
        • @TravieDudeMinecraftandMore +1 - 也为我工作。
        【解决方案14】:

        您不能单独使用rmdirdel 删除所有内容:

        • rmdir /s /q 不接受通配符参数。所以rmdir /s /q *会报错。
        • del /s /f /q 将删除所有文件,但会保留空的子目录。

        我的首选解决方案(正如我在许多其他批处理文件中使用的那样)是:

        rmdir /s /q . 2>NUL
        

        【讨论】:

          【解决方案15】:

          简单的答案:

          C:
          del /S /Q C:\folderName\oderFolderName\*
          

          C: 如果您必须从 D: 切换到 C: 或 C: 切换到 D:(或其他任何东西),这一点很重要

          /S递归,所有子文件夹一起删除

          /Q如果你不激活安静模式,提示符会要求你为每个子文件夹输入 y...你不想要那个

          小心,这很激烈。

          【讨论】:

            【解决方案16】:

            我想建议使用像cleardir 这样的简单工具。所以,在批处理文件中你可以写:

            cleardir path/to/dir
            

            你会得到空目录dir。有点慢,但仍然解决了“问题”。

            我是该工具的作者 =)

            【讨论】:

              【解决方案17】:

              最简单的方法是:

              1. 创建 *.txt 文件
              2. 写: rmdir /q /s 。目录
              3. 将文件另存为 *.bat 在您要清除的文件夹中(您可以调用文件 NUKE.bat)
              4. 打开它

              警告!

              这将删除文件夹中的所有内容,而无需请求确认!!!

              所以要明智地选择保存它的地方。

              【讨论】: