5

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

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

我更喜欢不使用 VBS(并找到了一个可以在 VBS 中工作的代码片段),尽管我也可以为 Powershell 重新编写我的脚本,但理想情况下我想坚持使用 cmd。

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

4

2 回答 2

8

这是针对forfiles相关/D +dd日期的设计缺陷的解决方法,假设将来无法修改任何项目,并且它基于两个嵌套循环并依赖于设置以防万一没有项目与提供的搜索条件匹配的forfiles事实:forfilesErrorLevel

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循环遍历至少与 variable 给出的一样旧的项目MINAGE。内部forfiles循环在从外部循环接收迭代文件时最多迭代一次,@file如果它也至少与MAXINC(equals MAXAGEplus 1) 一样旧,则返回相同的文件;如果不是,forfiles则将 设置ErrorLevel1,然后由执行以下命令的操作员捕获||,即echo,仅在ErrorLevel已设置为非零值的情况下。

两者MINAGE和都MAXAGE不能是负数(命令set "MAXAGE=%MAXAGE:*-=%"set "MINAGE=%MINAGE:*-=%"删除减号以防万一)。引入了临时变量MAXINC,以便将MAXAGE自己指定的年龄包含在返回的结果中。

重定向> nul防止外部forfiles返回空行,内部返回满足其搜索条件的项目(因为我们对那些不满足的项目感兴趣)。2> nul防止内部forfiles循环在违反其搜索条件的情况下返回错误消息。> con覆盖命令以实际返回所需的项目> nulecho

if @isdir==FALSE部分过滤掉目录,以便只处理文件。如果您只想处理目录,请更改FALSE为;TRUE如果您想同时处理两者,请将其完全删除。

于 2016-04-12T22:54:02.283 回答
2

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

$refdate = (Get-Date).AddDays(-90)
Get-ChildItem | Where-Object {
    $_.LastWriteTime -ge $refdate
} | Select-Object -Expand Name
于 2013-10-10T15:18:27.643 回答