正如@JosefZ 在他的评论中已经指出的那样,if无法比较日期值。
但是,要在修改日期的某个范围内过滤文件,您可以使用两个嵌套forfiles循环:
> nul 2>&1 forfiles /D +01-12-2015 /C "forfiles forfiles /M @file /D -31-12-2105 /C 0x22cmd /C if 00x7840isdir==FALSE > con echo 00x7840fdate 00x7840file0x22"
发展
两个嵌套循环的外部forfiles循环枚举具有修改日期范围的给定下限的项目(dd-MM-yyyy日期以我系统的(短)日期格式的格式给出;查看帮助文本forfiles /?以了解适合您系统的格式):
forfiles /D +01-12-2015
这将返回 2015 年 12 月 1 日或之后修改的所有项目。
然后使用内部循环仅返回在 2015 年 12 月 31 日或更早时间修改过的项目。为此,我们需要基于以下内容创建命令行:
forfiles /M * /D -31-12-2015 /C "cmd /C echo @fdate @file"
后面的掩码/M需要设置为@file外循环返回的值,所以内循环每次外循环迭代一次;所以内部循环只是根据修改日期过滤外部接收到的每一项。after 的位置/P不需要指定,因为外循环已经从当前迭代项所在的目录执行了内循环(或者通常是命令 after )(如果提供了开关来处理子目录,/C这也是如此)/S还)。
现在的挑战是@file从外循环中隐藏像内循环这样的变量。诀窍是使用 ; 的十六进制代码替换功能forfiles。例如,0x20将替换为空格、0x22引号、-符号和is 0x40the letter 。由于这种替换甚至在替换 - 变量之前就完成了,我们需要声明从外部循环中隐藏符号,从而避免替换,例如,因为将变为,所以内部循环接收,它将被转换返回,然后立即替换为它的值。@0x78x@00x7840@@file@0x400x40file@file
因此,带有嵌套forfiles循环的命令行可能如下所示:
forfiles /D +01-12-2015 /C "forfiles forfiles /M @file /D -31-12-2105 /C 0x22cmd /C echo 00x7840fdate 00x7840file0x22"
要过滤掉目录并仅返回文件,您需要检查@isdir:
forfiles /D +01-12-2015 /C "forfiles forfiles /M @file /D -31-12-2105 /C 0x22cmd /C if 00x7840isdir==FALSE echo 00x7840fdate 00x7840file0x22"
最后,为避免返回空行或错误消息,请forfiles使用重定向:
> nul 2>&1 forfiles /D +01-12-2015 /C "forfiles forfiles /M @file /D -31-12-2105 /C 0x22cmd /C if 00x7840isdir==FALSE > con echo 00x7840fdate 00x7840file0x22"
另请参阅以下帖子: