我正在尝试使用修改后的时间戳将文件列表与控制文件进行比较

dir /b /tw /od controlfile olderfile | more +1

这应该返回 controlfile 修改日期为 olderfile 早于 controlfile. 。然而,它似乎是在创建日期进行比较(olderfile的创建日期晚于 controlfile's) 所以总会回来 olderfile. 。这 /tw 开关应该告诉 dir 使用最后写入日期(从 dir /?)所以我不确定如果我希望 /tw 按照记录工作我做错了什么?

:更新:

到目前为止我已经 olderfile 在相对于的子文件夹中 controlfile. 。当我复制的时候 olderfile 到相同的目录 controlfile 比较按预期进行 - 即上面的命令返回 controlfile. 。因此,位于子文件夹中显然会破坏比较(即使子文件夹修改日期类似于 olderfile本身早于 controlfile).

所以我现在的问题是,鉴于需要目录结构,我该如何解决这个问题?

有帮助吗?

解决方案

首先解释一下您的代码失败的原因。

查看不带 /B 选项的 DIR,它始终将文件路径显示为标题行,而不是与文件名一起显示。当使用排序选项以及同一目录中的 2 个文件规范时,该命令能够对文件进行排序并将它们显示在同一目录标题下。即使文件名重复,您也可以确切地知道标头引用了哪个文件。

但是,如果两个文件规范位于不同的路径中,则文件名有可能相同,只是路径不同。在这种情况下,除非每个文件规范都在其自己的标题下排序,否则排序没有任何好处;否则你无法区分哪个文件是哪个。对单个文件进行排序没有多大意义,但请记住文件规范可能包含通配符,因此它是有意义的。因此,每当排序选项与使用不同路径的多个文件规范组合时,DIR 将为每个路径进行单独的排序,每个路径都有自己的标头。

添加 /B 选项会删除路径标头,但不会更改排序行为!绝对是一个愚蠢且无用的设计,但这就是你得到的。

找到解决方案的问题要大得多,特别是如果您想仅使用本机 Windows 命令使用纯批处理。使用批处理处理日期可能会令人恼火。

我能想到的最方便的批处理解决方案是将第二个文件临时复制到父目录中,在父目录中运行比较,然后删除临时副本。但如果文件很大,这可能会成为问题。它还假设父目录中尚不存在该文件名。如果它确实(或可能)存在,您可以将该文件复制到不同的名称,已知是唯一的。当然,你必须翻译结果。

据我所知,任何其他批处理解决方案都需要解析日期和时间。这就打开了一整罐蠕虫。(这是可行的)

如果 COPY 建议不可接受(如果您决定不使用它,我不会责怪您),那么我建议使用批处理以外的其他工具,可能是 VBScript、Javascript 或 Powershell。或者也许是混合方法,例如添加一些 VBScript 的批处理。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top