正如@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 0x40
the letter 。由于这种替换甚至在替换 - 变量之前就完成了,我们需要声明从外部循环中隐藏符号,从而避免替换,例如,因为将变为,所以内部循环接收,它将被转换返回,然后立即替换为它的值。@
0x78
x
@
00x7840
@
@file
@
0x40
0x40file
@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"
另请参阅以下帖子: