1
forfiles /D +12/1/%2 /C "cmd /c if /I @FDATE LEQ 12/31/%2 move @file %3\Archive\12-%2 >NUL"

forfiles 应该针对最后修改日期在 2015 年 12 月 1 日至 2015 年 12 月 31 日(包括 1 日和 31 日)之间的所有文件,并将它们移动到存档。由于未知原因,最后修改日期为 2015 年 12 月 3 日和 2015 年 12 月 9 日的某些文件未被移动。此外,不会移动上次修改日期为 2015 年 12 月 4 日至 2015 年 12 月 8 日的所有文件。

调试步骤:处理不同的月份:1 月、2 月等,存档成功。权限已经过检查和验证。手动归档未移动的文件。创建了未移动文件的副本,但仍然遇到相同的问题。我做的最后一件事是更换

if /I @FDATE LEQ 12/31/%2 move @file %3\Archive\12-%2 >NUL

echo @FDATE

确保所有修改的日期都是可见的。未成功移动和归档的文件的修改日期可见。

4

3 回答 3

0

正如@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"

另请参阅以下帖子:

于 2016-04-12T19:20:21.850 回答
0

命令行if无法比较日期值。例如,在和之间的日期间隔中看到错误的结果March 30, 2016April 10, 201630.3.201610.4.2016就我的 Windows 语言环境而言):

==> forfiles /D +30.3.2016 /C "cmd /c if @FDATE leq 10.4.2016 (echo @fdate yes @file) else ( echo @fdate NOO @file)"

31.03.2016 NOO "file36322183.txt"
12.04.2016 NOO "inputs.bat"
03.04.2016 yes "mycharmap.bat"
09.04.2016 yes "SO"
12.04.2016 NOO "ttt.txt"

==>

切换到 powershell 似乎并不比嵌套更麻烦forfiles

==> forfiles /D +30.3.2016 /C "powershell -command if ('@FDATE'.ToDateTime([Globalization.CultureInfo]::CurrentCulture) -le '10.4.2016'.ToDateTime([Globalization.CultureInfo]::CurrentCulture)) { echo '@fdate yes @file'} else { echo '@fdate NOO @file'}"

31.03.2016 yes file36322183.txt
12.04.2016 NOO inputs.bat
03.04.2016 yes mycharmap.bat
09.04.2016 yes SO
12.04.2016 NOO ttt.txt

==>

Powershell 命令给出了正确的结果。但是,我也会测试@isdir属性(请参阅SO上面两个列表中的文件夹)。

于 2016-04-12T21:38:50.833 回答
0

这是我最终要工作的内容:

SET Backups=C:\Users\%username%\Documents\Backups

forfiles /P %Backups%\Backups--Cisco_Smartnet /m  *.xls /D -90 /C 

"cmd /c move @file %Backups%\Backups--Cisco_Smartnet\Old_Backups--

3+_Months_Old

对我来说,这是将 90 天或更早 (/D -90) 的电子表格 (.xls) 移动到旧的备份文件夹。@file 是目录中满足此条件的任何文件。%backups% 变量对于这个命令并不重要,它只是在我做很多这些时节省了我的时间。SET 行是它自己的行。而从 Forfiles 到最后是它自己的路线。

我希望这会有所帮助,玩得开心!

于 2016-04-29T01:02:19.910 回答