删除超过30天的子目录

时间:2010-08-05 20:55:47

标签: batch-file

我正在尝试创建一个批处理脚本,该脚本将删除超过30天的所有子目录。 我是批处理脚本的新手,所以我只是希望有人可以帮我解决这个问题。

我能够找到一个删除指定位置的所有子目录的脚本。

@for /f "tokens=*" %%a in ('dir /s /b "C:/temp/test" 2^>NUL') do rd /s /q "%%a"

有人可以调整此脚本,以便只删除30天以前的目录吗?

7 个答案:

答案 0 :(得分:9)

我认为FORFILES会这样做......

FORFILES -D 30将迭代30天前修改的所有文件

所以,像......

FORFILES /S /D -30 /C "cmd /c IF @isdir == TRUE rd @path"

应该(未经测试)递归删除超过30天的所有文件夹:)

顺便说一句 - 查看http://ss64.com/nt/以获得更多命令行优势

答案 1 :(得分:1)

假设您仅限于批处理文件... check this - 但如果您可以使用VBScript,我认为您可以执行bit better


既然您已经澄清了您的真实问题,请理解如果您打算使用System.exec(),您将不得不面对许多弊端。

或者,如果你真的想使用JNDI(你提到“原生”但不明确你的意思)也许这会有所帮助:http://mindprod.com/products1.html#FILETIMES

答案 2 :(得分:1)

你的系统上有PowerShell吗?

dir | ? { $_.LastWriteTime -lt [DateTime]::Now.AddDays(-30) } | % { rm $_.FullName }

答案 3 :(得分:1)

我知道这是一个较老的话题;然而,我最近想要做到这一点,并且能够通过建立马特罗伯茨的建议。我使用了以下FORFILES语法:

FORFILES /P \path\to\dir /S /C "cmd /c IF @isdir == TRUE rmdir /S @path /Q" -D -30

您需要将\path\to\dir替换为您要在其上运行的目录(/ P)的路径(包括驱动器号)。然后递归(/S)搜索目录并运行(/C)rmdir(再次递归)。如果没有/Q,系统会询问您是否要删除每个目录/文件,因此如果您计划在脚本中静默运行,则需要使用它。您可以通过将-D更改为其他内容来更改天数(-30)。

然后我使用任务计划程序每周自动执行一次(确认工作)。要确保其有效,请将任务设置为“以最高权限运行”

注意:此设置将不可撤销地删除文件。它们不会出现在您的回收站中。所以一旦它们消失,它们就会消失(除非你有备份)。

答案 4 :(得分:1)

这对我来说很好:

由马特·罗伯茨(Matt Roberts)发布-> FORFILES /S /D -30 /C "cmd /c IF @isdir == TRUE rd @path"

使用“以管理员身份运行”启动“ .bat”文件时要小心,它没有使用文件的当前位置,而是使用该位置-> "C:\Windows\system32"

出于节省的原因,添加/P "C:\temp"

FORFILES /P C:\temp /S /D -30 /C "cmd /c IF @isdir == TRUE rd @path"

答案 5 :(得分:0)

您可能需要考虑使用Windows脚本宿主,您可以在其中运行VBScript来执行此操作。可以把它想象成一个具有更大灵活性和强大功能的批处理文件。

请参阅http://www.computing.net/answers/programming/wsh-delete-files-in-folder-by-date/16255.html

答案 6 :(得分:0)

这不是一个简单的调整。就目前而言,没有简单的方法(我知道)在cmd解释器中执行date-diff操作。

首先,您必须解析当前日期:

C:\>date /T
Thu 08/05/2010

获得日,月,年后,您必须获取目录列表中每个项目的日期,您可以通过删除/b命令中的dir参数并修改标记行给你标记1和4,即tokens=1,4,然后自己做日期数学,这将是一个痛苦,因为你必须处理不同的长度月,12月 - >一月过渡(新的一年)等,你几乎肯定会弄错。

同时添加/ad参数以获取目录。

我建议使用PowerShell或其他一些脚本技术,为您提供操作日期所需的工具。