我正在尝试创建一个批处理脚本,该脚本将删除超过30天的所有子目录。 我是批处理脚本的新手,所以我只是希望有人可以帮我解决这个问题。
我能够找到一个删除指定位置的所有子目录的脚本。
@for /f "tokens=*" %%a in ('dir /s /b "C:/temp/test" 2^>NUL') do rd /s /q "%%a"
有人可以调整此脚本,以便只删除30天以前的目录吗?
答案 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或其他一些脚本技术,为您提供操作日期所需的工具。