FORFILES date -after-(cmd文件中的日期计算)

时间:2013-10-10 13:06:29

标签: windows date powershell batch-file cmd

我想在cmd文件中使用FORFILES,在给定日期到“今天”之后对所有文件执行操作。我可以使用类似forfiles /d +07/10/2013 /c "cmd /c echo @fname"之类的东西在7月10日之后对所有内容采取行动,但我想要的是能够在“今天”之前的90天内进行计算。

日期计算的语法是否可以在cmd文件中使用,以便我指定“今天之前的x天”来输入FORFILES?

我更喜欢不使用VBS(并找到可在VBS中运行的代码片段),不过我可以为Powershell重写我的脚本,但理想情况下我想坚持使用cmd。

澄清一下,“ - 90”会发现所有超过90天的文件; “+90”会发现所有文件都比90天后更新(从根本上来说没用,因为文件很少用未来日期编写),“+ 7/30/2013”​​会发现所有文件都比7/30更新/ 2013。我想要最后一个时间段,最好能够将一个天数变量传递给CMD文件,即“在今天之前x天之后”,即“在最后x天”。因此,我希望能够在cmd文件中计算该日期,而不是使用上面显示的硬编码日期。

2 个答案:

答案 0 :(得分:5)

以下是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一样长,则返回相同的文件(等于MAXAGE1);如果不是,则forfilesErrorLevel设置为1,而||则由执行以下命令的echo运算符捕获,即ErrorLevel,仅在MINAGE已设置为非零值的情况下。

MAXAGEset "MAXAGE=%MAXAGE:*-=%"都不能为负数(命令set "MINAGE=%MINAGE:*-=%"MAXINC会删除减号)。引入了临时变量MAXAGE,以便将> nul本身指定的年龄包含在返回的结果中。

重定向forfiles阻止外部2> nul返回空行,而内部行返回符合其搜索条件的项目(因为我们对那些不符合条件的人感兴趣)。 forfiles阻止内部> con循环返回错误消息,以防其违反搜索条件。 > nul会覆盖echo if @isdir==FALSE命令以实际返回所需的项目。

FALSE部分过滤掉目录,以便只处理文件。如果您只想处理目录,请将TRUE更改为variable = value ;如果你想要处理它们,请完全删除它。

答案 1 :(得分:1)

在PowerShell中,您可以执行以下操作:

$refdate = (Get-Date).AddDays(-90)
gci | ? { $_.LastWriteTime -ge $refdate } | select Name