我正在寻找一种方法来删除批处理文件中超过7天的所有文件 . 我在网上搜索过,发现了一些包含数百行代码的示例,还有一些需要安装额外的命令行实用程序才能完成任务 .
只需几行代码,类似的东西就可以done in BASH . 对于Windows中的批处理文件,似乎至少可以轻松实现 . 我正在寻找一个在标准Windows命令提示符下工作的解决方案,没有任何额外的实用程序 . 请不要使用PowerShell或Cygwin .
我正在寻找一种方法来删除批处理文件中超过7天的所有文件 . 我在网上搜索过,发现了一些包含数百行代码的示例,还有一些需要安装额外的命令行实用程序才能完成任务 .
只需几行代码,类似的东西就可以done in BASH . 对于Windows中的批处理文件,似乎至少可以轻松实现 . 我正在寻找一个在标准Windows命令提示符下工作的解决方案,没有任何额外的实用程序 . 请不要使用PowerShell或Cygwin .
23 回答
对于Windows 2012 R2,以下方法可行:
查看将被删除的文件使用此
对于Windows Server 2008 R2:
这将删除超过90天的所有.sql文件 .
IMO,JavaScript逐渐成为一种通用的脚本标准:它可能在比其他任何脚本语言更多的产品中可用(在Windows中,它可以使用Windows Scripting Host) . 我必须清理许多文件夹中的旧文件,所以这里有一个JavaScript函数:
对于要清除的每个文件夹,只需向clearFolder()函数添加另一个调用 . 此特定代码还保留exe和dll文件,并清理子文件夹 .
如果您有XP资源工具包,则可以使用robocopy将所有旧目录移动到单个目录中,然后使用rmdir删除该目录:
我可能会为这个已经很有 Value 的线程添加一份不起眼的贡献 . 我发现其他解决方案可能会删除实际的错误文本,但忽略了%ERRORLEVEL%,这表示我的应用程序出现故障 . 只要它不是“找不到文件”错误,我合法地想要%ERRORLEVEL% .
Some Examples:
Debugging and eliminating the error specifically:
Using a oneliner to return ERRORLEVEL success or failure:
Using a oneliner to keep the ERRORLEVEL at zero for success within the context of a batchfile in the midst of other code (ver > nul resets the ERRORLEVEL):
For a SQL Server Agent CmdExec job step I landed on the following. I don't know if it's a bug, but the CmdExec within the step only recognizes the first line of code:
你应该做
/d -3
(3天前)这对我来说很好 . 因此,所有复杂的批次都可能在垃圾桶中 . 此外forfiles
不支持UNC路径,因此请与特定驱动器 Build 网络连接 .看看我的answer到similar question:
这将删除早于给定日期的文件 . 我确信它可以修改为从当前日期开始七天 .
update: 我注意到HerbCSO对上述脚本进行了改进 . 我建议改用his version .
批处理文件通常需要解决与日期/时间相关的相关问题 . 但命令行解释器 cmd.exe 没有日期/时间计算功能 . 已经在此处,Stack Overflow的其他页面以及其他网站上发布了许多使用其他控制台应用程序或脚本的良好工作解决方案 .
基于日期/时间的操作的共同点是要求将日期/时间字符串转换为自确定日期以来的秒数 . 很常见的是1970-01-01 00:00:00 UTC . 但是,根据支持特定任务所需的日期范围,也可以使用任何后续日期 .
Jay发布7daysclean.cmd包含命令行解释器 cmd.exe 的快速"date to seconds"解决方案 . 但它并没有将闰年考虑在内 . J.R.考虑了当前年度的闰日,但忽略了自基准年以来的其他闰年,即自1970年以来 .
我使用20年来使用一个小C函数创建一次的静态表(数组),用于快速获取包含在C / C中编写的应用程序中日期/时间转换函数中1970-01-01的闰日的天数 .
这种非常快速的表方法也可以使用 FOR 命令在批处理代码中使用 . 所以我决定编写批处理子程序
GetSeconds
,它计算自1970-01-01 00:00:00 UTC以来传递给该例程的日期/时间字符串的秒数 .Note: 由于Windows文件系统也不支持闰秒,因此不考虑闰秒 .
首先,表格:
使用无符号的32位变量(即C / C中的无符号长整数(或无符号整数)),只能在1970-01-01开始时计算2039年到2106年的秒数 .
但 cmd.exe 用于数学表达式的带符号32位变量 . 因此最大值为2147483647(0x7FFFFFFF),即2038-01-19 03:14:07 .
使用这些表格将日期转换为自1970-01-01以来的秒数非常简单 .
Attention please!
日期和时间字符串的格式取决于Windows区域和语言设置 . 如果需要,分配给
GetSeconds
的第一个 FOR 循环中的环境变量Day
,Month
和Year
的分隔符和标记顺序必须适应本地日期/时间格式 .如果环境变量 DATE 中的日期格式与日期格式不同,则必须调整环境变量的日期字符串在
%%~tF
上由命令 FOR 使用 .例如,当
%DATE%
扩展为Sun 02/08/2015
而%%~tF
扩展为02/08/2015 07:38 PM
时,以下代码可用于将第4行修改为:这导致传递给子程序
02/08/2015
- 没有工作日缩写的3个字母和分隔空格字符的日期字符串 .或者,可以使用以下格式以正确的格式传递当前日期:
现在,日期字符串中的最后10个字符被传递给函数
GetSeconds
,因此无论环境变量 DATE 的日期字符串是否有工作日都没关系,只要日期和月份总是以预期顺序的2位数,即格式为dd/mm/yyyy
或dd.mm.yyyy
.这是批处理代码,用于解释注释,只输出要删除的文件以及保存在
C:\Temp
文件夹树中的文件,请参阅第一个 FOR 循环的代码 .为获得最佳性能,最好删除所有注释,即在0-4前导空格后以 rem 开头的所有行 .
并且阵列也可以做得更小,即减少从1980-01-01 00:00:00到2038-01-19 03:14:07的时间范围,如上面的批处理代码目前所支持的那样,例如2015-01 -01到2019-12-31,如下面的代码所用,它真正删除
C:\Temp
文件夹树中超过7天的文件 .此外,下面的批次代码针对24小时时间格式进行了优化 .
有关Windows上的日期和时间格式以及文件时间比较的更多信息,请参阅Find out if file is older than 4 hours in batch file上的答案以及有关文件时间的大量其他信息 .
请享用:
有关详细信息,请参阅forfile documentation .
有关更多好处,请参阅An A-Z Index of the Windows XP command line .
如果您的计算机上没有安装
forfiles
,请将其从任何Windows Server 2003复制到您的Windows XP计算机%WinDir%\system32\
. 这是可能的,因为EXE在Windows Server 2003和Windows XP之间完全兼容 .Windows和Windows Server的更高版本默认安装它 .
对于Windows 7:
语法稍有改变 . 因此更新的命令是:
使用forfiles .
有不同的版本 . 早期使用unix样式参数 .
我的版本(对于服务器2000 - 切换后没有空格) -
要向XP添加forfiles,请从ftp://ftp.microsoft.com/ResKit/y2kfix/x86/获取exe
并将其添加到C:\ WINDOWS \ system32
Ok感到无聊并想出了这个,其中包含我的版本的穷人的Linux纪元更换限制为每日使用(没有时间保留):
7daysclean.cmd
用法
set /a strip=day*7
:将 7 更改为要保留的天数 .set dSource=C:\temp
:这是检查文件的起始目录 .注意
这是非破坏性代码,它将显示将要发生的事情 .
变化:
类似于:
所以文件实际上被删除了
February :硬编码为28天 . 真的,Bissextile年是一个地狱 . 如果某人有想法不会添加10行代码,请继续发布,然后将其添加到我的代码中 .
epoch :我没有花时间考虑,因为需要删除早于某个日期的文件,花费数小时/分钟就会删除一天中用于保存的文件 .
限制
epoch 理所当然地认为您的短日期格式是YYYY-MM-DD . 它需要适用于其他设置或运行时评估(读取sShortTime,用户绑定配置,在过滤器中配置正确的字段顺序,并使用过滤器从参数中提取正确的数据) .
我提到我讨厌这个编辑器的自动格式吗?它删除了空行,复制粘贴是一个地狱 .
我希望这有帮助 .
我认为e.James's answer很好,因为它早在Windows 2000 SP4(可能更早)就可以使用未经修改的Windows版本,但它需要写入外部文件 . 这是一个修改后的版本,在保持兼容性的同时不会创建外部文本文件:
为了忠实于原始问题,这里是一个脚本,如果你以天数作为参数调用它,它会为你做所有数学运算:
注意:上面的代码考虑了闰年,以及每个月的确切天数 . 唯一的最大值是自0/0/0以来的总天数(之后它返回负数年) .
注意:数学只有一种方式;它无法从负面输入中正确获取未来日期(它会尝试,但很可能会超过该月的最后一天) .
ROBOCOPY 对我很有用 . 最初建议我的伊曼 . 但不是将文件/文件夹移动到临时目录,而是删除临时文件夹的内容, move the files to the trash!!!
这是我的备份批处理文件的几行,例如:
它可清除“Temp”文件夹中超过15天的任何内容,并清除AutoCAD备份文件夹中的任何内容 . 我使用变量,因为行可以变得很长,我可以将它们重用于其他位置 . 您只需找到与您的登录相关联的回收站的dos路径 .
这是在我的工作计算机上,它的工作原理 . 我知道你们中的一些人可能拥有更多限制性权利,但无论如何都要试一试;)搜索Google以获取有关ROBOCOPY参数的解释 .
干杯!
对7daysclean.cmd的这一修改如何考虑闰年?
它可以在不到10行编码中完成!
Edit by Mofi:
由于语法无效,J.R.贡献的上述条件总是评估为 false .
并且
Month GEQ 2
也是错误的,因为在闰年中仅需要在3月到12月期间再添加86400秒,而不是2月份 .在Jay发布的批处理文件 7daysclean.cmd 中,将闰日考虑在内的工作代码(仅在当前年度)将是:
这并不奇怪,但我今天需要做这样的事情并按计划任务运行它等 .
批处理文件,下面的DelFilesOlderThanNDays.bat示例exec w / params:
天哪,已经有很多答案了 . 我发现一个简单方便的路由是使用 & 参数从单个Windows命令行指令按顺序执行两次ROBOCOP.EXE .
在此示例中,它的工作原理是挑选所有超过30天的文件( . )并将它们移动到目标文件夹 . 第二个命令再次添加 PURGE 命令,这意味着删除目标文件夹中源文件夹中不存在的文件 . 基本上,第一个命令MOVES文件和第二个DELETES,因为在调用第二个命令时它们不再存在于源文件夹中 .
查阅ROBOCOPY的文档并在测试时使用/ L开关 .
你可以把它拉下来 . 您可以查看this question,以获得更简单的示例 . 当你开始比较日期时,复杂性就来了 . 可能很容易判断日期是否更大,但如果您需要实际获得两个日期之间的差异,则需要考虑许多情况 .
换句话说 - 不要试图发明这个,除非你真的不能使用第三方工具 .
扩展了aku的答案,我看到很多人都在询问UNC的路径 . 只需将unc路径映射到驱动器号就可以使forfiles满意 . 例如,可以在批处理文件中以编程方式完成驱动器的映射和取消映射 .
这将删除扩展名为.gz且超过7天的所有文件 . 如果你想确保Z:在使用之前没有映射到任何其他东西,你可以做一些简单的事情
运行以下commands:
移动所有文件(使用/ mov,移动文件,然后删除它们而不是/ move,移动整个文件树点然后删除)通过robocopy到另一个位置,然后在该路径上执行删除命令,你就是全部好 .
此外,如果您有一个包含大量数据的目录,您可以使用
/mir
开关我的命令是
@PATH
- 在我的情况下只是路径,所以我不得不使用@PATH\@FILE
也
forfiles /?
也不适合我,但forfiles
(没有"?")工作正常 .我唯一的问题是:如何添加多个掩码(例如“.log | .bak”)?
所有这些关于forfiles.exe我downloaded here(在win XP上)
但是,如果您使用Windows服务器forfiles.exe应该已经存在,它与ftp版本不同 . 这就是我应该修改命令的原因 .
对于Windows Server 2003,我使用此命令:
这个为我做了 . 它适用于日期,你可以减去想要的数量,以便追溯到时间:
cmd /c del @path /F
中的/F
强制删除特定文件,在某些情况下文件可以是只读的 .dateYear
是年变量,您可以根据自己的需要更改减法我的脚本删除超过特定年份的文件:
复制此代码并将其另存为DelOldFiles.vbs .
仅在命令提示中使用:cscript DelOldFiles.vbs 15
15表示删除过去15天以上的文件 .