【问题标题】:How do I get the last modified date of a file in multiple directories?如何获取多个目录中文件的最后修改日期?
【发布时间】:2014-09-12 20:08:10
【问题描述】:

我正在尝试制作一个简单的批处理脚本,该脚本比较 4 个不同目录中的 4 个文件并将“上次修改”文件放入变量中。我最接近的是使用'dir'排序并使用修改日期对其进行排序:

for /f "tokens=*" %%G in ('dir *.txt /b /s /a-d /od C:\testing ') do SET newest1=%%G

但是,这仅适用于一个目录。所以我的问题是,我如何确定最后修改的文件来自多个目录(实际上需要四个不同的文件夹)。

我试过了:

FOR /F %%i IN ('DIR /b /s /O:D /T:W C:\testing\test1\test.txt C:\testing\test2\test2.txt') DO SET NEWEST=%%i

但这不适用于多个目录。我猜因为我要处理多个目录,所以排序不起作用,那我还能用什么?

一些注意事项:

  • 需要将文件精确到秒

  • 有些文件可能会变得相当大,因此将它们全部复制到另一个文件夹然后比较它们会花费很长时间并且效率不会很高

【问题讨论】:

  • 文件是否有共同的文件规范?有关文件的详细信息可以帮助您获得最简单的解决方案。如果文件在同一个驱动器上,那么移动是一个非常快速的操作,它们可以被移回——但我们对文件知之甚少。 Robocopy 也可用于获取最新文件 - 取决于文件的位置。
  • 你说“4 个文件”——所以你知道文件名——还是文件名变量?

标签: windows batch-file cmd


【解决方案1】:

如果您的系统是 Windows Vista 或更高版本(或者如果您被允许下载 Windows Server 2003 资源工具包工具),您可以使用robocopy 将这 4 个文件复制到一个文件夹中。是的,我已经阅读了注释。诀窍是 robocopy 中的 /create 开关在目标文件夹中生成文件的 0 字节实例,但保留文件的时间戳。然后你可以使用你的第一个代码来解决问题

如果你不能使用robocopy,但管理员权限不是问题

@echo off
    setlocal enableextensions disabledelayedexpansion

    for %%f in (
        "c:\\somewhere\\file1.txt"
        "c:\\other\\place\\file2.txt"
        "c:\\somewhere\\file2.txt"
    ) do for /f "tokens=2 delims==." %%a in ('
        wmic datafile where name^="%%~f" get lastModified /value
    ') do set "_t[%%a]=%%~f"

    for /f "tokens=2 delims==" %%a in ('set _t[') do set "lastFile=%%a"
    set "lastFile=%lastFile:\\=\%"

    echo %lastFile%

此代码使用wmic 检索文件的时间戳,使用时间戳作为索引存储在环境中的数组中。然后检索列表,它将按升序排列。数组中的最后一个元素是较新的文件。

【讨论】:

  • 感谢您的快速回复。但是,您提供的代码对我不起作用(在具有管理员权限的 Windows 7 机器上测试它)。我只是用实际文件替换了文件名并尝试运行它。它三次给出以下错误:“没有可用的实例。”当它到达 for 语句时,它似乎失败了。我已经验证路径名是正确的,并且没有空格/特殊字符。
  • @steven,我的错,我没有删除所有测试代码并且循环正在迭代一个不存在的文件(wmic 的原因回答“没有可用的实例” )。代码已更新。无论如何,对于 Windows 7,4 个robocopy 操作可以比对 wmi 的 4 个查询更快。
猜你喜欢
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
  • 2019-02-26
相关资源
最近更新 更多