【问题标题】:Use forfiles to delete a folder and its contents使用 forfiles 删除文件夹及其内容
【发布时间】:2016-09-07 19:02:57
【问题描述】:

我正在尝试清除公共目录,因此当项目超过 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,而不是文件夹。

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

【问题讨论】:

  • 使用rd 删除文件夹。它不会删除非空文件夹,除非你给它一个/s /q
  • 您是否要检查文件夹是否存在 30 天?如果是,则使用@isdir 变量仅检查目录,然后删除该目录。

标签: windows batch-file cmd forfiles


【解决方案1】:

您使用的命令行非常危险(我只是在这里复制并重新排序了开关):

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会返回一个目录之前返回它的子项,在同一命令行中检查目录是否为空是没有意义的,你需要做以后再说吧。

为此,您可以像这样使用第二个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

【讨论】:

    【解决方案2】:

    用于 cmd

    for /D %I in ("%cd%\*") do rd "%~fI" 2> nul
    

    用于 bat 文件

    for /D %%I in ("%cd%\*") do rd "%%~fI" 2> nul
    

    【讨论】:

    • 请添加更详细的解决方案说明
    猜你喜欢
    • 1970-01-01
    • 2017-07-15
    • 2014-04-01
    • 1970-01-01
    • 2017-12-21
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多