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

我想在一个cmd文件中使用FORFILES,在给定的date之后通过“today”来处理所有文件。 我可以使用forfiles /d +07/10/2013 /c "cmd /c echo @fname"东西在7/10/13之后执行,但是我想要的只是从90天开始计算在“今天”之前。

是否有一个date计算的语法,将在一个cmd文件,将让我指定“今天之前x天”饲料到FORFILES?

我更喜欢不使用VBS(并且发现了可以在VBS中工作的代码片段),不过我可以重写Powershell的脚本,但理想情况下我想使用cmd。

为了澄清,“-90”会find所有超过90天的文件; “+90”会发现所有文件比今天晚90天以后(这基本上是无用的,因为文件很less会在未来的date编写),“+7/30/2013”​​将查找所有比7/30更新的文件/ 2013。 我想要最后一段时间,最好能够传递给CMD文件的天数variables,也就是说“在今天之前x天之后”,即“在最近x天”。 所以,而不是如上所示使用硬编码的date,我希望能够在cmd文件中计算该date。

在PowerShell中,你可以做这样的事情:

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

这是一个针对/D +dddate的forfiles的devise缺陷的forfiles ,假设将来不能修改任何项目,并且基于两个嵌套的forfiles循环,并依赖于forfilesErrorLevel设置为案件没有项目符合提供的search条件:

 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循环遍历至less与variablesMINAGE一样旧的项目。 内部forfiles循环,当它从外部循环接收到迭代文件@file ,最多迭代一次,如果它也至less与MAXINC (等于MAXAGE1 )一样旧,则返回相同的文件。 如果不是,则forfilesErrorLevel设置为1 ,然后由||捕获 只有在ErrorLevel被设置为非零值的情况下才执行以下命令,即echo

MINAGEMAXAGE不能为负数的情况下( set "MAXAGE=%MAXAGE:*-=%"set "MINAGE=%MINAGE:*-=%" )。 引入临时variablesMAXINC是为了将MAXAGE自身指定的年龄包含在返回的结果中。

redirect> nul防止外部forfiles返回空行,内部返回符合其search条件的项目(因为我们感兴趣的是那些没有)。 2> nul防止内部forfiles循环返回错误消息,以防违反search条件。 > con覆盖> nulecho命令实际返回所需的项目。

if @isdir==FALSE部分将筛选出目录,以便仅处理文件。 如果您只想处理目录,则将FALSE更改为TRUE ; 如果你想同时处理这两个,请将其完全删除。