【问题标题】:Date Comparisons in Batch - Looking for advice批量日期比较 - 寻求建议
【发布时间】:2020-10-05 10:09:09
【问题描述】:

我正在尝试构建一个批处理脚本,它将遍历一组文件夹并为我提供最近修改的文件(稍后检查该文件的日期是否为 180 天)。现在,我正在处理的是:

setlocal EnableDelayedExpansion

for /f %%f in ('dir /b /s /od /tw "<some UNC path>\*.*"') do (

REM Make sure the variable is defined the first time we try to compare it
if NOT DEFINED fileDateTime set fileDateTime=%%~tf

if %%~tf LEQ !fileDateTime! (
 set fileDateTime=%%~tf
 set fileName=%%nxf
 set filePath=\\%%~pf
))

这不起作用。具体来说,除了开始时的比较之外的所有内容都有效。计算机如何解析 LEQ 似乎完全是任意的;我找不到一致的模式。这绝对不是比较两个日期。

变量 !fileDateTime!始终与 %%~tf 具有相同的格式,基本上按照定义。但是 Batch 不知道如何处理它,或者更确切地说,我不知道如何告诉 Batch 如何处理它。

我尝试过使用 ForFile,但有问题的路径是网络共享,所以它失败了(出于某种原因,Net Use 的解决方法也不喜欢工作。)

有没有更简单的方法来获取文件夹中的最新文件并检查它的存在时间?

(另外,保存 UNC 路径的服务器是 linux 服务器,所以如果这在 Bash 中更容易,我也可以这样做。)

编辑:如果有人想知道我是如何解决这个问题的,我的解决方案是“意识到我绝对没有理由这样做是批处理开始,在服务器上安装 Python,然后在其中编写脚本。”现在,这将是我将来解决批处理问题的首选解决方案。但是非常感谢大家的建议,如果我不改变策略,这肯定会有所帮助。

【问题讨论】:

  • %%~tf 的值取决于您的本地设置。 If 不能比较日期,只能比较整数或字符串。在if defined 之后有两个set 命令(希望是复制/粘贴错误?)
  • @Stephan 是的,那是一个复制错误,我会去修复它。有没有什么好方法可以将日期转换为批处理中的整数?到目前为止,我所看到的非常复杂。
  • Dir/OD/TW 将根据文件的最后修改日期和时间从最旧到最新列出您的文件,但将分别输出每个子目录的顺序,而不是整个列表.你能解释一下你到底想做什么,因为我的假设是你希望为第一个子目录传播一个变量,如果下一个子目录的日期或时间更近,要么保留它,要么扔掉它那,然后继续遍历每个子目录,直到剩余变量值将是所需的最新完全限定文件名的末尾。
  • 查看我的回答here。 (接受的答案可能对您不起作用)。如果这对您有帮助,请告诉我们。
  • 另外两种可能的解决方案here

标签: date sorting batch-file


【解决方案1】:

你得到的日期是一个字符串,而不是你在面向对象语言中得到的日期对象。
而且 LEQ 运算符只能比较整数,不能比较任意字符串。
更糟糕的是,您获得的日期字符串的格式取决于您的操作系统本地化和用户偏好。
要进行有意义的比较,您必须首先将日期字符串转换为儒略日期(一个整数,计算自初始参考日期以来的天数。)然后将这些整数一起比较。
为此,我建议您在此处使用 :jdate 函数:
https://www.dostips.com/DtCodeCmdLib.php#Function.jdate

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 2011-12-10
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 2011-12-31
    • 2018-11-24
    相关资源
    最近更新 更多