windows - FORFILES date -after-(cmd 文件中的日期计算)

标签 windows powershell batch-file cmd forfiles

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

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

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

澄清一下,“-90”会找到所有早于 90 天的文件; “+90”会找到所有比今天晚 90 天更新的文件(这基本上是无用的,因为文件很少用 future 日期写入),“+7/30/2013”​​会找到所有比 7/30 更新的文件/2013.我想要最后一个时间段,最好能够将天数变量传递给 CMD 文件,这会说“在今天之前的 x 天之后”,即“在过去的 x 天内”。因此,我不想使用如上所示的硬编码日期,而是希望能够在 cmd 文件中计算该日期。

最佳答案

这是针对 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(等于 MAXAGE1);如果不是,forfilesErrorLevel 设置为 1,然后由 || 运算符捕获执行以下命令,即 echo,仅在 ErrorLevel 已设置为非零值的情况下。

MINAGEMAXAGE 都不能为负数(命令 set "MAXAGE=%MAXAGE:*-=%"set "MINAGE=%MINAGE:*-=%" 删除减号以防万一)。引入了中间变量 MAXINC,以便将 MAXAGE 本身指定的年龄包含到返回的结果中。

重定向 > nul 防止外层的 forfiles 返回空行和内层的返回满足其搜索条件的项目(因为我们对那些做不是)。 2> nul 防止内部 forfiles 循环在违反其搜索条件时返回错误消息。 > conecho 命令覆盖 > nul 以实际返回所需的项目。

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

关于windows - FORFILES date -after-(cmd 文件中的日期计算),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19296588/

相关文章:

PHP 启动 : Unable to load dynamic library, Windows、Apache 2.2、php 5.2.11

c++ - SWI-Prolog C++ 接口(interface)

sql-server - 当脚本结果正确时,Powershell 返回负退出代码

powershell - 防止集成终端自动打开

powershell - 在屏幕和变量中调用表达式输出

batch-file - 为什么命令“如果%errorlevel%1做”会导致退出批处理文件?

windows - 在仅采用交互式参数的命令行上自动化可执行文件(无法在执行时指定参数)

windows - 获取网站IP地址的批处理脚本?

c# - 标签未显示在WinForm应用程序中

windows - 批处理文件调用 vbs 不会从任务计划程序运行