【问题标题】:Adding copy\overwrite logic to a batch file将复制\覆盖逻辑添加到批处理文件
【发布时间】:2014-05-20 13:53:26
【问题描述】:

美好的一天。我正在尝试编写我的第一个批处理文件。我终于完成了最基本的任务,并且在这里阅读了很多有助于包括教程的内容。我还没有找到一篇文章来帮助我把我正在寻找的东西放在一起。我的搜索能力很弱。

我希望我的批处理文件每 30 分钟复制一次所有文件。但是,如果涉及到已更新的文件,我希望它复制而不是替换目标中的现有文件。我假设它只会在文件名中添加 (1) 或“副本”。我不确定我是否使用了正确的开关,或者是否需要根据我正在寻找的东西来改变它们。我认为他们很好,但我离题了。

这是我创建的没有逻辑的批次:

REM Backup files 30 minutes
@echo off
:start
XCOPY "C:\source directory" "C:\target directory" /d /c /s /r /y /i
TIMEOUT /t 1800 /nobreak
goto start

【问题讨论】:

    标签: batch-file


    【解决方案1】:

    正常行为是覆盖文件或失败(取决于操作)。 (1)(copy) 后缀是 Windows 资源管理器(shell)的特殊功能。如果您想在脚本中实现类似的行为,则必须自己实现。

    最简单的事情(也是为了防止很多(1),(2)..(N)个文件,是创建单独的文件夹。您可以创建一个带有时间戳的文件夹并将所有修改过的文件复制到其中。

    要检测哪些文件被修改,您可以使用文件的Archive 标志。当一个文件被修改时,它的存档标志被设置。 XCopy 可以只复制那些设置了标志的文件。实际上这个标志的主要目的是确定修改过的文件(或者至少是你想要归档的文件)。

    所以我的建议:

    • 创建一个名称中带有时间戳的文件夹。为此,您可能需要使用 the answer to this question
    • XCopy/M 参数一起使用。 /M 仅复制具有 Archive 属性的文件,并且之后清除该属性。
    • 尝试使用rdrmdir 删除目录,但不要使用/S 参数。如果它包含文件,它将失败,但这样可以防止出现大量空目录。

    在执行此操作之前,请确保修改文件的进程也再次设置存档属性。它应该自动执行此操作,但对其进行测试也无妨。

    -edit- 每个请求一个例子:

    REM Backup files 30 minutes
    @echo off
    :start
    
    REM generate a timestamp value that can be used as a file name.
    setlocal TIMESTAMP=%DATE:~10,4%-%DATE:~4,2%-%DATE:~7,2%-%TIME:~0,2%-%TIME:~3,2%-%TIME:~6,2%
    
    REM Not needed, I think: Creating the directory yourself.
    REM md "C:\target directory\%TIMESTAMP%"
    
    REM /S for recursive. /I should create target directory? /M for backup mode.
    XCOPY "C:\source directory" "C:\target directory\%TIMESTAMP%" /M /S /I
    
    REM Not needed, I think: Removing the directory (if it's empty).
    REM rd "C:\target directory\%TIMESTAMP%"
    
    TIMEOUT /t 1800 /nobreak
    goto start
    

    我认为/I 已经解决了其他问题。如果目标不存在,它假定它是一个目录。这让我假设它实际上会创建该目录,如果它不存在,并且可能只有当有任何东西要复制时。如果这是正确的,您也不必删除该目录,如果它是空的。

    考虑清理:请记住,此方法(使用 /M)仅复制已更改的文件。如果你清理旧目录,你应该确保首先复制整个文件夹。带时间戳的文件夹将仅包含修改后的文件(增量备份),因此如果您清理旧文件,您的备份/副本将不再完整!

    【讨论】:

    • 非常感谢。如果我理解正确,并且我这样做:“最简单的事情(也是为了防止很多 (1)、(2) .. (N) 文件)是创建单独的文件夹。您可以创建一个带有时间戳的文件夹和将所有修改过的文件复制到其中。”,它将创建时间戳文件夹并根据运行时间简单地将文件放入其中?我喜欢这个想法,因为这样我就可以编写另一个批处理来删除我不需要的东西时间限制。
    • 我通读了您为设置时间戳文件夹提供的答案,但无法辨别我将如何将这些示例中的任何一个写入我的批处理中。任何人都可以根据我上面的批次提供一个例子吗?
    • 好的。做到了。我希望它符合您的要求。请务必阅读 cmets,并在测试此脚本之前进行实际备份。 :-)
    猜你喜欢
    • 2015-01-26
    • 2017-12-06
    • 1970-01-01
    • 2020-05-19
    • 2021-09-18
    • 2013-10-17
    • 1970-01-01
    • 2013-05-11
    • 2013-08-08
    相关资源
    最近更新 更多