【问题标题】:Check if file was modified after xx days in the past检查文件是否在过去 xx 天后被修改
【发布时间】:2015-06-03 12:37:49
【问题描述】:

我正在检查文件中的修改日期。我想测试一下/d -3之后文件是否被修改过。根据docs,这将检查文件是否在该日期之前被修改。我需要检查文件是否在该日期之后被修改。文档还声明我可以指定日期。我可能最终会这样做,尽管生成一个日期来检查我希望尽可能避免的日期会稍微复杂一些。 我该怎么办?

forfiles /m Item_Lookup2.csv /d -3 >nul 2>nul && (
  echo - updated

  goto :PROCESS_FILE
) || (

  echo - out of date
  set outdated="true"

  goto :CHECK_ERRORS
)

我找到了这个in this answer

【问题讨论】:

  • 再次阅读文档,特别是/D date 部分。
  • @SomethingDark 我需要它是一个数值,而不是一个特定的日期。我希望有一个更简单的方法。

标签: date batch-file windows-7 last-modified


【解决方案1】:

您在正确的轨道上,但 forfiles /d -n 测试文件修改 n或更早,而不是更晚。您需要做的是反转您的 &&|| 代码块,并可能指定 4 天而不是 3 天。

如果匹配,则它是 4 天或更早,并被归类为过期。如果不匹配,则在过去 3 天内已更新。

试试这个:

forfiles /d -4 /m "Item_Lookup2.csv" >NUL 2>NUL && (
    echo - out of date
    set outdated="true"
    goto :CHECK_ERRORS
) || (
    echo - updated
    goto :PROCESS_FILE
)

额外提示:如果您想进行一些测试,可以使用 PowerShell 命令手动操作文件的最后修改时间戳:

powershell "(gi Item_Lookup2.csv).LastWriteTime='6/1/2015 09:30:00 AM'"

... 将 Item_Lookup2.csv 的最后修改时间戳设置为 6 月 1 日上午 9:30。盐调味。

【讨论】:

  • 哇 - 如此简单明了的解决方案,一旦我看到它。但我敢打赌,我是许多从未想过这个解决方案的人之一。
  • 谢谢!当然,如果文件根本不存在,则会导致误报。应该在forfiles 行之前添加一个额外的if not exist "Item_Lookup2.csv" 检查以防止这种情况发生。
  • 查看我的ROBOCOPY solution——同样有效,但计算年龄的规则略有不同。这两种解决方案都不是更好,这取决于您要使用什么规则。
【解决方案2】:

我真的很喜欢rojo's answer - 如此简单。我发现它在计算年龄时忽略了时间分量很有趣。因此,如果当前时间是午夜并且最后修改的时间戳是前一天的 23:59:59,则 1 秒的实际年龄可以计算为一天。这可能是也可能不是您想要的行为。

我有一个基于 ROBOCOPY 的不同解决方案,它在计算文件年龄时使用完整的时间戳。因此,如果您指定的最长期限为 3 天,则它会查找在过去 72 小时内创建或修改的文件。

ROBOCOPY 的一个优点是它允许您指定最小年龄和/或最大年龄。

returned ERRORLEVEL is complicated,翻译起来不方便。我没有使用 ERRORLEVEL,而是检查该命令是否列出了有问题的文件。如果没有列出文件,我使用 FOR /F 循环会引发错误。 BREAK 命令是一个简单的命令,如果列出了文件,它总是成功并且不产生任何输出。

lots of ROBOCOPY options,很多都是这个应用程序需要的:-)

(for /f %%A in (
  'robocopy . "%temp%" "Item_Lookup2.csv" /maxage:3 /is /it /xx /l /ndl /njh /njs'
) do break) && (
  echo - updated
  goto :PROCESS_FILE
) || (
  echo - out of date
  set outdated="true"
  goto :CHECK_ERRORS
)

【讨论】:

  • 有趣的想法!明天我在 Windows 上时必须尝试一下。 %%A 我应该期待什么?
  • 它列出了 ROBOCOPY 类(例如newsame)、文件大小和文件名(带路径)。您可以添加 /NC/NS 选项来消除输出中的类和大小。
  • @pcnate - 您还可以添加 /TS 选项以获取最后修改的时间戳。我相信无论语言环境如何,格式都将始终为 YYYY/MM/SS hh:mm:ss 24 小时格式。
【解决方案3】:

使用纯批处理按不同时间过滤文件并不容易,因此我尝试创建一个常用工具 - FileTimeFilterJS.bat(可能远非完美)。尝试:

call FileTimeFilterJS.bat "." -filetime modified -direction after -dd -3

【讨论】:

  • 看起来要使用这个我应该将库保存在`E:\JScript\'中?
  • @pcnate - 不!它使用内置的 wsh/jscript。 `E:\JScript\' 只是 cscript.exe 的命令行参数,表示使用 jscript 引擎。
  • 有什么方法可以指定单个文件?或者我应该如何处理输出?
  • @pcnate - 否 - 因为它已实现,您只能将目录传递给搜索。您可以使用 FINDSTRFIND 过滤输出
  • 我真的很喜欢这个想法,尽管它不是我正在寻找的最简单的答案。感谢分享,我以后很可能会更多地使用它,因为我不知道你可以作为/从批处理文件执行 JS(或其他方式)。
【解决方案4】:

forfiles /D +n 显然是在寻找带有未来时间戳的文件。或者,使用此 Powershell 脚本开始:

## usage: ff.ps1 [-age n] [-mask *.*]
## find files newer than n days 
## with filenames matching mask

Param (
    [float]$age = 0,
    [string]$mask = '*.*'
)

$from = $(get-date).addDays(-$age)
GCI -path '.' -filter $mask -recurse -force | Where {$_.attributes -ne "Directory"-and $_.lastwritetime -gt $from } | ForEach { write-host $_.lastwritetime '   ' $_.fullname }

这很简单,您可以指定最大年龄 (-age n) 和/或文件掩码 (-mask *.csv)。输出是时间戳+完整文件名,可以轻松修改。查看日期计算并将其与 DOS 批处理所需的噩梦进行比较。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-04
    • 2015-02-10
    • 1970-01-01
    • 2011-11-27
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    相关资源
    最近更新 更多