如何通过命令提示符删除给定文件夹中的所有文件/子文件夹?

Ton*_*ich 69 windows windows-7 command-line

我想在 Windows 7 中删除批处理文件中的所有文件和子文件夹并保留顶级文件夹。基本上清空文件夹。什么是命令行指令?

MDM*_*rra 65

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

del /S C:\Path\to\directory\*
Run Code Online (Sandbox Code Playgroud)

  • 这是错误的答案,我不知道为什么它收到了很多赞成票。似乎人们没有完全理解这个问题,也没有阅读评论!我会仔细检查答案并选择正确的答案。 (18认同)
  • 但是它留下了子文件夹,你怎么还告诉它删除子文件夹本身? (7认同)
  • 说明:del 代表删除,S 代表递归。 (4认同)
  • 并使用 /Q 保留空子文件夹,这是不可取的。 (4认同)
  • @Tony_Henrich,在此处了解有关 msdos 命令的更多信息。http://www.computerhope.com/msdos.htm (3认同)
  • @Moab - 该链接对 Windows 7 不是很有用。例如 deltree 不存在 (2认同)
  • 它留下了空的子文件夹。 (2认同)

小智 31

最佳解决方案:例如,我想删除父目录的所有文件和子目录,可以说“C:\Users\Desktop\New folder\”。简单的方法是创建以下三个命令的批处理文件。

cd C:\用户\桌面\新文件夹\

删除 * /S /Q

rmdir /S /Q "C:\Users\Desktop\New folder\"

这里首先会清理所有子目录中的所有文件,然后清理所有空的子目录。由于当前工作目录是父目录,即“\New folder”,rmdir 命令不能删除这个目录本身。

  • 真危险。如果有人继续删除/重命名`C:\Users\Desktop\New folder\`,CD 的第一行就会失败,你的批处理文件会愉快地删除当前(默认)目录中的所有内容。这很可能最终成为您的工作目录或 C:\Windows\System32 (7认同)
  • 不好。硬编码路径,通过查看它,它不会清空文件夹。它删除它。也很危险。如果路径不存在或拼写错误,它会删除当前文件夹中的文件。 (3认同)
  • 效果很好,除了系统无法删除根文件夹时出现警告。 (2认同)

小智 15

导航到父目录:

pushd "Parent Directory"
Run Code Online (Sandbox Code Playgroud)

删除子文件夹:

rd /s /q . 2>nul
Run Code Online (Sandbox Code Playgroud)

  • 哇,这很hackish。:) (2认同)
  • 这基本上等同于之前的两个答案。 (2认同)
  • 同意上面的内容 - 这是以前答案的副本,替换为与它们要替换的命令同义的命令。 `pushd` 不会在此处添加任何 `cd` 尚未执行的操作。 (2认同)

fir*_*ood 8

您可以通过将这三个指令放入 bat 文件中来快速轻松地完成此操作:

mkdir empty_folder
robocopy /mir empty_folder "path_to_directory"
rmdir empty_folder
Run Code Online (Sandbox Code Playgroud)


小智 7

rmdir "c:\pathofyourdirectory" /q /s
Run Code Online (Sandbox Code Playgroud)

不要忘记使用引号,因为/q /s它将删除所有存储库并且不会提示。

  • 问题是“我想在 Windows 7 中删除批处理文件中的所有文件和子文件夹,并**保留顶级文件夹。**” (4认同)

小智 7

您可以使用 rmdir 删除文件和子文件夹,如下所示:

rmdir /s/q MyFolderPath
Run Code Online (Sandbox Code Playgroud)

但是,它要快得多,尤其是当您的结构中有很多子文件夹要在 rmdir 之前使用 del 时,如下所示:

del /f/s/q MyFolderPath > nul
rmdir /s/q MyFolderPath
Run Code Online (Sandbox Code Playgroud)

  • `rmdir` 命令(两者相同)将删除父文件夹。这*不是*问题的答案。人们为什么不读书? (2认同)

Syn*_*ech 7

user340956 非常接近解决方案,但你知道他们对 close\xe2\x80\xa6 的看法

\n\n

需要明确的是,rd /s /q c:\\foobar删除目标目录及其内容之外,但您并不总是想删除目录本身,有时您只想删除其内容并保留该目录。该deltree命令可以做到这一点,但微软以其无限的“智慧”删除了该命令并且没有将其移植到 Windows。

\n\n

这是一个无需借助第三方工具即可工作的解决方案。使用命令行脚本可能会尽可能简单和高效,而不是直接编写实际的可执行文件。它不设置任何环境变量,也不使用任何循环。它也尽可能安全,尽可能进行错误检查,并且通过内置文档尽可能用户友好。

\n\n

dt.bat(或者dt.cmd对于孩子们;无论如何,我老了,我使用.bat):

\n\n
:: dt is a Windows-compatible version of the deltree command\n:: Posted to SuperUser by Synetech: https://superuser.com/a/1526232/3279\n\n@echo off\ngoto start\n\n:start\n    if ["%~1"]==[""] goto usage\n    pushd "%~1" 2>nul\n    if /i not ["%cd%"]==["%~1"] goto wrongdir\n    rd /s /q "%~1" 2>nul\n    popd\ngoto :eof\n\n:usage\n    echo   Delete all of the contents of a directory\n    echo.\n    echo   ^> %0 DIR\n    echo.\n    echo   %0 is a substitute for deltree, it recursively deletes the contents\n    echo   (files and folders) of a directory, but not the directory itself\n    echo.\n    echo   DIR is the directory whose contents are to be deleted\ngoto :eof\n\n:wrongdir\n    echo Could not change to the target directory. Invalid directory? Access denied?\ngoto :eof\n
Run Code Online (Sandbox Code Playgroud)\n\n

它的工作原理如下:

\n\n
    \n
  1. 它检查是否已传递命令行参数,如果没有传递,则打印使用信息并退出。
  2. \n
  3. 它用于pushd保存当前目录,然后切换到目标目录,将任何错误重定向到以nul获得更清晰的命令行体验(和更清晰的日志)。
  4. \n
  5. 它检查当前目录现在是否与目标目录相同,如果不同,则打印一条错误消息并退出。这可以避免在命令失败时意外删除前一个目录的内容pushd(例如,传递无效目录、访问错误等)\n\n
      \n
    • 此检查不区分大小写,因此它在 Windows 上通常是安全的,但对于任何区分大小写的文件系统(例如 *nix 系统使用的文件系统)而言并不安全,即使在 Windows 下也是如此。
    • \n
    • 它不适用于短文件名(例如,即使它们实际上是C:\\Users\\Bob Bobson\\foobar相同的,也不会被视为相同)。C:\\Users\\BobBob~1\\foobar使用非短文件名有点不便,但安全总比遗憾好,特别是因为 SFN 并不完全可靠或总是可预测的(甚至可能完全禁用)。
    • \n
  6. \n
  7. 然后,它用于rd删除目标目录及其所有内容,将任何错误(目录本身至少应该有一个错误)重定向到nul. 关于此的一些注释:\n\n
      \n
    • 由于目标目录是当前目录,系统对其有一个打开的文件句柄,因此实际上无法删除它,因此它保持原样,这是所需的行为。
    • \n
    • 因为在目标目录的内容被删除之前它不会尝试删除目标目录,所以它现在应该是空的(除了任何也具有打开文件句柄的目录)。
    • \n
  8. \n
  9. 最后,它用于popd返回到先前的当前目录并结束脚本。
  10. \n
\n\n

rem(如果您愿意,可以使用或对上述描述的脚本进行注释::。)

\n