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 +dd
date的forfiles
的devise缺陷的forfiles
,假设将来不能修改任何项目,并且基于两个嵌套的forfiles
循环,并依赖于forfiles
将ErrorLevel
设置为案件没有项目符合提供的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
(等于MAXAGE
加1
)一样旧,则返回相同的文件。 如果不是,则forfiles
将ErrorLevel
设置为1
,然后由||
捕获 只有在ErrorLevel
被设置为非零值的情况下才执行以下命令,即echo
。
在MINAGE
和MAXAGE
不能为负数的情况下( set "MAXAGE=%MAXAGE:*-=%"
并set "MINAGE=%MINAGE:*-=%"
)。 引入临时variablesMAXINC
是为了将MAXAGE
自身指定的年龄包含在返回的结果中。
redirect> nul
防止外部forfiles
返回空行,内部返回符合其search条件的项目(因为我们感兴趣的是那些没有)。 2> nul
防止内部forfiles
循环返回错误消息,以防违反search条件。 > con
覆盖> nul
为echo
命令实际返回所需的项目。
if @isdir==FALSE
部分将筛选出目录,以便仅处理文件。 如果您只想处理目录,则将FALSE
更改为TRUE
; 如果你想同时处理这两个,请将其完全删除。