删除超过30天的子目录。

4
我正在尝试创建一个批处理脚本,以删除所有超过30天的子目录。 我对批处理脚本非常陌生,所以希望有人能帮助我解决这个问题。 我找到了一个可以删除指定位置下所有子目录的脚本。
@for /f "tokens=*" %%a in ('dir /s /b "C:/temp/test" 2^>NUL') do rd /s /q "%%a"

有人能调整这个脚本,使其仅删除30天前的目录吗?

感谢您的回复。主要应用程序是使用Java编写的,但令人惊讶的是Java文件API没有提供getCreateTime(),只有lastModified()。我将从Java中执行本机代码,解析输出并删除文件夹。 - Marquinio
请看我的修订答案... - p.marino
7个回答

9
我认为FORFILES可以完成这个任务...
FORFILES -D 30将迭代所有最近修改时间在30天前的文件
因此,可以这样做...
FORFILES /S /D -30 /C "cmd /c IF @isdir == TRUE rd @path"

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

顺便说一句 - 查看 http://ss64.com/nt/ 获取更多命令行好玩的东西


2
这对我来说很有效:
发布者 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"

1

假设您只能使用批处理文件... 请查看此处 - 但如果您可以使用VBScript,我认为您可以做得更好一些


现在您已经澄清了您的真正问题,请理解如果您打算使用System.exec(),那么您将不得不应对很多缺点。

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


很不幸,现在“check this”会显示404错误,“bit better”则会显示一个空白的白屏。 - joehanna
已修复(我使用了互联网档案馆) - p.marino

1
你的系统上有PowerShell吗?

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


1

我知道这是一个比较旧的话题;不过,最近我也想要这样做,通过借鉴Matt Roberts的建议,我成功地实现了。我使用了以下的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,则会询问您是否要删除每个目录/文件,因此如果您计划在脚本中静默运行此操作,则需要使用它。您可以通过更改 -30 来更改天数 (-D)。
然后,我使用任务计划程序自动化此操作,每周执行一次(已确认有效)。为确保其正常工作,请使用“以最高权限运行”设置任务。
注意:此设置将不可撤销地删除文件。它们不会出现在回收站中。因此,一旦它们消失了,它们就消失了(除非您有备份)。

0

0

这不会是一个简单的调整。目前为止,在cmd解释器中执行日期差操作没有简单的方法(据我所知)。

首先,您需要解析当前日期:

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

一旦你有了日、月、年,你就必须为目录列表中的每个项目获取日期,这可以通过删除dir命令中的/b参数并修改令牌行以给出令牌1和4来完成,即tokens=1,4,然后自己进行日期计算,这将是一个痛苦的过程,因为你必须处理不同长度的月份,以及12月到1月的转换(新年),等等,而且你几乎肯定会弄错。

还要添加/ad参数以仅获取目录。

我建议使用PowerShell或其他脚本技术,以便提供您需要操作日期的工具。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接