【问题标题】:Update file or folder Date Modified更新文件或文件夹 修改日期
【发布时间】:2013-02-18 23:19:28
【问题描述】:

我需要更新文件和文件夹的“修改日期”属性,因为它们从一个位置复制到另一个位置,以便“修改日期”= 当前系统时间。我有一台装有 Windows 7 的 PC,但我没有对其的管理权限,因此我无法安装任何自定义实用程序。我当前的 bat 文件使用 XCOPY:

xcopy "\\sharepoint\dept\gis\Abandoned_Wire\*.*" "\\corp.dom\fs4\g1\OUTPUT\GRIDPROD\PDF\Maps\Abandon Wire Maps" /c /s /r /y /i

在我的 Windows XP 机器上,我使用来自 UnxUtils 的“触摸”命令,但我找不到 Windows 7 原生的等效命令。谢谢!

【问题讨论】:

    标签: windows-7 batch-file cmd


    【解决方案1】:
    for /R %i in (\*.\*) do copy %i /B+ ,,/Y
    

    【讨论】:

    • 虽然这可能会回答问题,但在代码示例中添加解释总是好的。
    【解决方案2】:

    在 Windows 上“触摸”文件有一种非常简单(虽然晦涩难懂)的语法。 (更新最后修改的时间戳)

    如果文件在当前目录中,你只需要:

    copy /b fileName+
    

    如果文件位于其他路径中,则此方法有效:

    copy /b somePath\fileName+,, somePath\
    

    但是,您似乎仍有很多编码工作要做,因为我相信您只想触摸被复制的文件。

    以下内容未经测试,但我相信它会起作用。我不能保证表演。此解决方案需要 2 个未使用的驱动器号。我假设 K: 和 L: 可用。

    @echo off
    
    :: map unused drive letters to your source and target paths
    subst K: "\\sharepoint\dept\gis\Abandoned_Wire"
    subst L: "\\corp.dom\fs4\g1\OUTPUT\GRIDPROD\PDF\Maps\Abandon Wire Maps"
    
    :: replicate the folder hierarchy
    xcopy K: L: /t
    
    :: recursively copy and touch all files
    for /r K: %%F in (*) do (
      xcopy "%%F" "L:%%~pnxF" /r /y
      copy /b "L:%%~pnxF"+,, "L:%%~pF"
    )
    
    :: release the temporary drive mappings
    subst /d K:
    subst /d L:
    

    【讨论】:

    • EDIT - 将 COPY 更改为 XCOPY /R /Y 以避免现有只读文件出现问题
    【解决方案3】:

    您可以使用powershell,我相信它已默认安装在 Windows 7 上。将此行添加到您的批处理文件以运行一个 powershell 命令,该命令会更新所有名为 Abandoned_Wire*.* 的文件的时间戳:

    powershell.exe -command "ls 'folder\Abandoned_Wire\*.*' | foreach-object { $_.LastWriteTime = Get-Date }"
    

    那条线的作用很简单:

    -command:告诉powershell运行以下命令并立即返回

    ls: 列出指定路径下的所有匹配文件

    foreach-object:在ls 找到的每个文件上运行以下块

    $_.LastWriteTime = Get-Date:对于每个文件,将LastWriteTime 设置为Get-Date 返回的值(今天的日期和时间)

    【讨论】:

    • 很高兴看到有人解释他们的答案。投票++。
    • 我会假设您的 ps 代码功能与宣传的一样,我对 ps 几乎一无所知。但它会“触及”所有文件,而不仅仅是刚刚复制的文件。这可能是个问题。
    • @dbenham:不,它会触及所有名为“Abandoned_Wire*.*”的文件,这是 OP 最初指定的。我现在看到您已编辑该问题以添加 \,但我不相信这就是 OP 的意思。我让他/她自己决定。
    • 我看到了混乱的根源。原始问题将该行格式化为引号而不是代码。这导致一些"\\" 显示为"\",而"\" 显示为空。我将引用重新格式化为代码,我很确定它代表了 OP 的意图。路径和问题现在更有意义了。您的答案对原始格式的问题更有意义,但编辑确实使您的答案无效。即使使用原始问题格式,您的答案仍然容易触及并非来自源头的预先存在的文件。
    • 有道理。我已将 \ 添加到我的答案中。你是对的,目标文件夹中预先存在的文件也会被触及。这可以通过首先使用 powershell 执行复制来解决。
    【解决方案4】:

    Robocopy 应该能够为您执行此操作。 robocopy 是自 Vista 以来包含在 Windows 中的本机工具。

    robocopy "\sharepoint\dept\gis\Abandoned_Wire" "\corp.dom\fs4\g1\OUTPUT\GRIDPROD\PDF\Maps\Abandon Wire Maps" /COPY:DA /S /IS
    

    默认情况下robocopy 将复制DAT:数据、属性和时间戳,但这可以通过/COPY 标志来控制。

    请参阅robocopy /? 了解所有选项。

    【讨论】:

    • 这似乎应该可以工作,但它正在为我复制源的时间戳。
    • @dbenham 好吧,如果它不像它所说的那样工作,那将是相当令人失望的,但也不是那么令人惊讶。 :( 我只是自己尝试了一下,它只是忽略了/copy 标志并执行了DAT 复制。是时候退出调试了!
    • 如果有人对robocopy 的行为有任何见解,请前往stackoverflow.com/q/15212914/891976
    猜你喜欢
    • 2013-01-12
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 2022-01-04
    相关资源
    最近更新 更多