我想在 cmd 文件中使用 FORFILES,以对给定日期之后到“今天”的所有文件执行操作。我可以使用 forfiles/d +07/10/2013/c "cmd/c echo @fname"
之类的东西在 2013 年 7 月 10 日之后对所有内容采取行动,但我想要的只是能够从“今天”之前的 90 天开始计算。
是否有一种可以在 cmd 文件中使用的日期计算语法,可以让我指定“今天前 x 天”以输入 FORFILES?
我宁愿不使用 VBS(并找到了一个可以在 VBS 中运行的代码片段),尽管我也可以为 Powershell 重新编写我的脚本,但理想情况下我想坚持使用 cmd。
澄清一下,“-90”会找到所有早于 90 天的文件; “+90”会找到所有比今天晚 90 天更新的文件(这基本上是无用的,因为文件很少用 future 日期写入),“+7/30/2013”会找到所有比 7/30 更新的文件/2013.我想要最后一个时间段,最好能够将天数变量传递给 CMD 文件,这会说“在今天之前的 x 天之后”,即“在过去的 x 天内”。因此,我不想使用如上所示的硬编码日期,而是希望能够在 cmd 文件中计算该日期。
最佳答案
这是针对 forfiles
的设计缺陷的解决方案,涉及 /D +dd
天,假设将来没有任何项目可以修改,并且是基于两个嵌套的 forfiles
循环并依赖于 forfiles
设置 ErrorLevel
以防没有项目匹配提供的搜索条件:
rem Define minimum and maximum age in days here (0 means today):
set /A MINAGE=0, MAXAGE=90
set "MAXAGE=%MAXAGE:*-=%" & set "MINAGE=%MINAGE:*-=%" & set /A MAXINC=MAXAGE+1
> nul forfiles /D -%MINAGE% /C "cmd /C if @isdir==FALSE 2> nul forfiles /M @file /D -%MAXINC% || > con echo @fdate @file"
外层 forfiles
循环迭代至少与变量 MINAGE
给定的一样旧的项目。内部 forfiles
循环最多迭代一次,因为它从外部循环接收迭代文件 @file
,如果它也至少与MAXINC
(等于 MAXAGE
加 1
);如果不是,forfiles
将 ErrorLevel
设置为 1
,然后由 ||
运算符捕获执行以下命令,即 echo
,仅在 ErrorLevel
已设置为非零值的情况下。
MINAGE
和 MAXAGE
都不能为负数(命令 set "MAXAGE=%MAXAGE:*-=%"
和 set "MINAGE=%MINAGE:*-=%"
删除减号以防万一)。引入了中间变量 MAXINC
,以便将 MAXAGE
本身指定的年龄包含到返回的结果中。
重定向 > nul
防止外层的 forfiles
返回空行和内层的返回满足其搜索条件的项目(因为我们对那些做不是)。 2> nul
防止内部 forfiles
循环在违反其搜索条件时返回错误消息。 > con
为 echo
命令覆盖 > nul
以实际返回所需的项目。
if @isdir==FALSE
部分过滤掉目录,以便只处理文件。如果您只想处理目录,请将 FALSE
更改为 TRUE
;如果您想同时处理两者,请将其完全删除。
关于windows - FORFILES date -after-(cmd 文件中的日期计算),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19296588/