我想在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天之后的所有文件(这基本上毫无用处,因为文件很少写入未来日期),而“+7/30/2013”将查找所有晚于2013年7月30日的文件。我想要最后一个时间段,最好是能够将天数变量传递给CMD文件,它将显示为“在今天之前的x天之后”,即“在过去的x天中”。因此,我希望能够在cmd文件中计算该日期,而不是使用上面所示的硬编码日期。
2条答案
按热度按时间mspsb9vt1#
以下是
forfiles
与/D +dd
天有关的设计缺陷的解决方法,假定将来不能修改任何项,它基于两个嵌套的forfiles
循环,并依赖于forfiles
在没有项与提供的搜索条件匹配的情况下设置ErrorLevel
的事实:外部的
forfiles
循环遍历至少与变量MINAGE
给定的一样旧的项。内部forfiles
循环在从外部循环接收迭代文件@file
时最多迭代一次,如果它也至少与MAXINC
一样旧(等于MAXAGE
+1
),则返回相同的文件;如果不是这样,forfiles
将ErrorLevel
设置为1
,而只有在ErrorLevel
设置为非零值的情况下,||
操作符才会捕获该1
,该操作符执行以下命令,即echo
。MINAGE
和MAXAGE
都不能是负数(命令set "MAXAGE=%MAXAGE:*-=%"
和set "MINAGE=%MINAGE:*-=%"
去掉减号大小写)。引入了临时变量MAXINC
,以便将MAXAGE
本身指定的年龄包含在返回结果中。重定向
> nul
阻止外部forfiles
返回空行,而内部forfiles
则阻止返回满足其搜索条件的项(因为我们对那些不符合搜索条件的项感兴趣)。2> nul
防止内部forfiles
循环在其搜索条件被违反时返回错误消息。> con
覆盖> nul
以使echo
命令实际返回所需的项。if @isdir==FALSE
部分过滤出目录,以便只处理文件。如果只想处理目录,则将FALSE
更改为TRUE
;如果想同时处理两个目录,则将其完全删除。polhcujo2#
在PowerShell中,您可以执行以下操作: