Windows 如何获取多个目录中文件的最后修改日期?

Windows 如何获取多个目录中文件的最后修改日期?,windows,batch-file,cmd,Windows,Batch File,Cmd,我试图制作一个简单的批处理脚本,比较4个不同目录中的4个文件,并将“上次修改的”文件放入一个变量中。我最接近的方法是使用“dir”进行排序,并使用以下方法按修改日期进行排序: for /f "tokens=*" %%G in ('dir *.txt /b /s /a-d /od C:\testing ') do SET newest1=%%G 但是,这将只在一个目录上工作。所以我的问题是,我如何确定最后修改的文件来自多个目录(实际上四个不同的文件夹都需要它) 我试过: FOR /F %%i I

我试图制作一个简单的批处理脚本,比较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
但这不适用于多个目录。我猜,因为我处理的目录不止一个,所以排序无法工作,那么我还能用什么呢

一些注意事项:

  • 需要比较文件到秒

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


如果您的系统是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次查询更快。这些文件是否有一个通用的文件规范?有关文件的详细信息可以帮助您获得最简单的解决方案。如果文件在同一个驱动器上,那么移动是一个非常快速的操作,它们可以向后移动,但我们对文件知之甚少。Robocopy也可以用来获取最新的文件-这取决于文件的位置。你说“4个文件”-所以你知道文件名-或者是文件名变量?