我想在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文件中计算该日期,而不是使用上面显示的硬编码日期。
答案 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
一样长,则返回相同的文件(等于MAXAGE
加1
);如果不是,则forfiles
将ErrorLevel
设置为1
,而||
则由执行以下命令的echo
运算符捕获,即ErrorLevel
,仅在MINAGE
已设置为非零值的情况下。
MAXAGE
和set "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