在批处理文件中比较修改后的文件日期与当前日期

10

我需要编写一个批处理文件来完成一些任务。

最初我认为我的问题非常简单 - 获取指定目录中txt文件的修改日期,将该日期与当前日期进行比较,如果相同则执行某项操作。 如果不同,则执行其他操作。

我用来获取当前日期的命令是:

%date%

我用来获取指定文件修改日期的代码行是:

SET filename="C:\New Folder\New.txt"
FOR %%f IN (%filename%) DO SET filedatetime=%%~tf
ECHO %filedatetime:~0,-6% >> %destination%

在上述情况下,我只是使用echo查看返回的内容,似乎日期已经返回,但是我得到了额外的信息:

2012/02/19 02

我想知道如何获取上述值,并使它们可比较,以及如何正确地进行比较。

4个回答

15

在批处理中处理日期比应该更困难。

有一个命令可以在这种情况下使您的工作变得容易。FORFILES具有处理自特定日期以来已修改的文件的功能。使用 FORFILES /?从命令行获取有关其使用的文档。

这个简单的命令将列出所有今天已被修改的文件:

forfiles /m * /d 0
如果至少找到一个文件,则将ERRORLEVEL设置为0,否则将其设置为1。
您有一个特定的文件,因此可以使用
forfiles /m %filename% /d 0
if %errorlevel% == 0 (
  echo The file was modified today
  REM do whatever else you need to do
) else (
  echo The file has not been modified today
  REM do whatever else you need to do
)

有一种更简洁的方法来完成上述操作。使用&&运算符可以在先前的命令成功时有条件地执行命令,||用于在先前的命令失败时有条件地执行命令。但是,请注意,如果&&命令失败,||命令也将被执行。

forfiles /m %filename% /d 0 && (
  echo The file was modified today
  REM do whatever else you need to do
) || (
  echo The file has not been modified today
  REM do whatever else you need to do
)

这个运行得很好,但是有没有办法让它生成的输出静音? - pcnate
@pcnate - 当然可以,只需将 stdin 和 stderr 重定向到 NUL。forfiles /m %filename% /d 0 >nul 2>nul ... - dbenham
@dbenharm 谢谢。看起来只有在/d - nn匹配修改日期的情况下才有效。有可能匹配任何比/d - nn更新的东西吗? - pcnate
我为此打开了一个新的问题:https://dev59.com/q4vda4cB1Zd3GeqPa5Lz - pcnate

10

我喜欢dbenham的方法,但如果你想让你的代码工作,你可以这样做:

set currentDate=%date%
SET filename="C:\MyFile.txt"

FOR %%f IN (%filename%) DO SET filedatetime=%%~tf
IF %filedatetime:~0, 10% == %currentDate% goto same

goto notsame

:same
echo Dates the same, do some code here

goto next

:notsame
echo Dates NOT the same, do some code here
goto end

:next

如果你将来需要再次使用它,那么了解如何使其工作是值得的。


5
有时候这可能行不通——我的电脑就不行,因为%date%前面带有星期几。日期格式会根据语言环境而改变,这是使日期处理变得困难的原因之一。在特定机器上让某些东西起作用通常很容易,但一般情况下解决方案往往很难。 - dbenham
确实如此。我更喜欢你的答案。知道一周中的某一天是很有趣的,非常随机。 - SmithMart
这个东西太棒了,你刚刚救了我一命,谢谢 :) - akhil
已添加日期前缀修复。SET d=%date% SET Day=%d:7,2% SET Month=%d:4,2% SET Year=%d:~10,4% REM 根据您的语言环境将 / 更改为 - SET currentDate=%Month%/%Day%/%Year% - Zunair

2
除了在TechNet文章的评论中提到的问题以外,还有一个被提到但只有在阅读关于忽略时区的隐含内容时才会注意到的问题。由于ForFiles评估本地时间报告的修改日期,因此它将把在02:01 EST修改的文件视为比在02:59 EDT修改的文件。请参考微软TechNet上的ForFiles文档

0

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接