检查文件是否在过去xx天后被修改

时间:2015-06-03 12:37:49

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

我正在检查文件中修改的日期。我想测试文件是否在/d -3之后被修改。根据{{​​3}},这将检查文件是否在之前修改。我需要检查文件是否在那个日期后进行了修改。文档还声明我可以指定日期。我可能最终会这样做,虽然如果可能的话,生成一个日期来检查我想要避免的更复杂一点。 我怎么能这样做?

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
)

我发现了docs

4 个答案:

答案 0 :(得分:4)

您走在正确的轨道上,但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。盐味。

答案 1 :(得分: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
)

答案 2 :(得分:1)

使用纯批次过滤文件不是那么容易,所以我尝试创建一个常用的工具 - FileTimeFilterJS.bat(可能远非完美)。试试:

Add

答案 3 :(得分:0)

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批处理所需的噩梦进行比较。