windows - 使用 forfiles 删除文件夹及其内容

标签 windows batch-file cmd forfiles

我正在尝试清除一个公共(public)目录,所以当一个项目超过 30 天时,它应该被删除。我使用以下命令设置了一个批处理文件:

forfiles /p "C:\PATH\USERS\PATH\" /s /m *.* /c "cmd /c Del @path /q" /d -30

这很好用。但是,问题是它只会删除路径中文件夹中的项目。

示例:C:\PATH\USERS\PATH\HelloWorld\file.text 已超过 30 天。但该命令仅删除 file.text,而不删除文件夹。

我是否必须检查文件夹是否为空,然后使用另一个命令删除文件夹?

最佳答案

您正在使用的命令行非常危险(我只是将其复制到此处并重新排序了开关):

forfiles /S /D -30 /P "C:\PATH\USERS\PATH\" /M "*.*" /C "cmd /C del /Q @path"

因为 forfiles 返回文件和目录。假设有一个名为 container 的目录符合搜索条件(最后一次修改是在 30 天前或更早),则执行的 del 命令行为 del "C:\PATH\USERS\PATH\container"/Q,它会删除其中的所有 文件,即使是那些不满足搜索条件的文件(注意 del\folder 的行为像 del\folder\*).

要解决此问题,您需要过滤文件或目录,如下所示:

forfiles /S /D -30 /P "C:\PATH\USERS\PATH" /M "*" /C "cmd /C if @isdir==FALSE del @path"

我还将文件掩码从 *.* 更改为 *,因为 forfiles 与所有内部命令相反,不匹配文件在给出 *.* 的情况下没有扩展名。此外,我从路径中删除了尾随 \,否则 forfiles 会引发错误:ERROR: The directory name is invalid..


但现在是完全不同的事情——您实际问题的答案:

因为 forfiles/S 将返回一个目录before 它返回它的子项,检查目录是否为空是没有意义的命令行,您需要稍后执行此操作。

为此,您可以像这样使用第二个 forfiles 循环(如果您愿意,还可以检查它们的最后修改日期;否则,删除 /D -30 部分):

forfiles /S /D -30 /P "C:\PATH\USERS\PATH" /M "*" /C "cmd /C if @isdir==TRUE rd @path 2> nul"

或者,如果目录修改日期不相关,您可以使用 for/D 循环,这也更快:

for /D %%I in ("C:\PATH\USERS\PATH\*") do rd "%%~fI" 2> nul

关于windows - 使用 forfiles 删除文件夹及其内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39377372/

相关文章:

windows - 使用 for 循环 Windows 批处理执行两次

linux - 在 windows 和 linux 上都会成功的命令,但会给出不同的结果

directory - Windows 中命令行目录更改 cd 的快捷方式?

c++ - 将 Netbeans 与 Cygwin 和 SDL(包括 SDL.h)一起使用会产生奇怪的错误

excel - 有没有办法从 CSV 中获取行而不加载整个文件?

windows - Jenkins PowerShell 插件无法执行脚本 - "ERROR: The target system must be running a 32 bit OS"

c# - .Net 跳码

powershell - 调用批处理文件并等待它完成

windows - 如何回复/避免要求 rmdir 确认?

windows - 在Windows提示符下计时每个命令