检查文件是否在过去 xx 天后被修改
Check if file was modified after xx days in the past
我正在检查文件中的修改日期。我想测试文件是否在/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
使用纯批处理按不同时间过滤文件并不容易,因此我尝试创建一个常用工具 - FileTimeFilterJS.bat(可能远非完美)。尝试使用:
call FileTimeFilterJS.bat "." -filetime modified -direction after -dd -3
您走在正确的轨道上,但是 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 AM。加盐调味。
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) and/or 文件掩码 (-mask *.csv)。输出是时间戳+完整的文件名,可以很容易地修改。查看日期计算并将其与 DOS 批处理所需的噩梦进行比较。
我真的很喜欢——就这么简单。我觉得有趣的是它在计算年龄时忽略了时间成分。因此,如果当前时间是午夜并且最后修改的时间戳是前一天的 23:59:59,则 1 秒的实际年龄可以计算为一天。这可能是也可能不是您想要的行为。
我有一个基于 ROBOCOPY 的不同解决方案,它在计算文件时限时使用完整时间戳。因此,如果您将最长期限指定为 3 天,那么它会查找在过去 72 小时内创建或修改的文件。
ROBOCOPY 的一个好处是它允许您指定最小年龄,and/or 最大年龄。
中的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
)
我正在检查文件中的修改日期。我想测试文件是否在/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
使用纯批处理按不同时间过滤文件并不容易,因此我尝试创建一个常用工具 - FileTimeFilterJS.bat(可能远非完美)。尝试使用:
call FileTimeFilterJS.bat "." -filetime modified -direction after -dd -3
您走在正确的轨道上,但是 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 AM。加盐调味。
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) and/or 文件掩码 (-mask *.csv)。输出是时间戳+完整的文件名,可以很容易地修改。查看日期计算并将其与 DOS 批处理所需的噩梦进行比较。
我真的很喜欢
我有一个基于 ROBOCOPY 的不同解决方案,它在计算文件时限时使用完整时间戳。因此,如果您将最长期限指定为 3 天,那么它会查找在过去 72 小时内创建或修改的文件。
ROBOCOPY 的一个好处是它允许您指定最小年龄,and/or 最大年龄。
中的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
)