将copy \ overwrite逻辑添加到批处理文件中

时间:2014-05-20 13:53:26

标签: batch-file

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

我希望我的批处理文件每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

1 个答案:

答案 0 :(得分:1)

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

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

要检测哪些文件已被修改,您可以使用文件的Archive标志。修改文件时,将设置其Archive标志。 XCopy可以仅复制那些设置了标志的文件。实际上,此标志的主要用途是确定已修改的文件(或至少是要存档的文件)。

所以我的建议是:

  • 在名称中创建一个带有时间戳的文件夹。您可能希望使用the answer to this question
  • XCopy/M参数一起使用。 /M仅复制具有Archive属性的文件,随后会清除该属性。
  • 尝试使用rdrmdir删除目录,但不使用/S参数。如果它包含文件,它将失败,但这样可以防止很多空目录。

在实现此操作之前,请确保修改文件的过程还会再次设置Archive属性。它应该自动完成,但测试它不会有害。

-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已经解决了其他问题。它假定target是一个目录,如果它不存在。这使我假设它实际上会创建该目录,如果它不存在,并且可能只有在有任何要复制的情况下。如果这是正确的,那么如果目录为空,您也不必删除该目录。

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