【问题标题】:DOS dir /tw switch not workingDOS 目录 /tw 开关不起作用
【发布时间】:2012-02-12 08:40:02
【问题描述】:

我正在尝试使用

将文件列表与修改后时间戳的控制文件进行比较
dir /b /tw /od controlfile olderfile | more +1

这应该返回controlfile,因为olderfile 上的修改日期早于controlfile。然而,它似乎在比较创建日期(olderfile 的创建日期在 controlfile 之后),因此将始终返回 olderfile/tw 开关应该告诉 dir 使用上次写入的日期(来自 dir /?),所以如果我希望 /tw 像记录的那样工作,我不确定我做错了什么?

:更新:

到目前为止,我在相对于 controlfile 的子文件夹中拥有 olderfile。当我将olderfile 复制到与controlfile 相同的目录时,比较按预期工作-即上述命令返回controlfile。因此,在子文件夹中显然会破坏比较(即使子文件夹的修改日期与olderfile 本身的日期一样早于controlfile 的日期)。

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

【问题讨论】:

    标签: batch-file dos last-modified dir if-modified-since


    【解决方案1】:

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

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

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

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

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

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

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

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

    【讨论】:

    • 在阅读您的回复之前,我正在将控制文件复制到目标目录(因此将第一个文件复制到子目录中)。然后清理子目录。这意味着不需要翻译。或者你说复制第二个文件而不是反之亦然是有原因的?
    • 我看不出有什么不同。如果子目录中已经存在控制文件名,您仍然会遇到问题。但听起来你的情况并非如此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 2011-09-24
    • 2012-03-23
    相关资源
    最近更新 更多