正常行为是覆盖文件或失败(取决于操作)。 (1) 或 (copy) 后缀是 Windows 资源管理器(shell)的特殊功能。如果您想在脚本中实现类似的行为,则必须自己实现。
最简单的事情(也是为了防止很多(1),(2)..(N)个文件,是创建单独的文件夹。您可以创建一个带有时间戳的文件夹并将所有修改过的文件复制到其中。
要检测哪些文件被修改,您可以使用文件的Archive 标志。当一个文件被修改时,它的存档标志被设置。 XCopy 可以只复制那些设置了标志的文件。实际上这个标志的主要目的是确定修改过的文件(或者至少是你想要归档的文件)。
所以我的建议:
- 创建一个名称中带有时间戳的文件夹。为此,您可能需要使用 the answer to this question。
- 将
XCopy 与/M 参数一起使用。 /M 仅复制具有 Archive 属性的文件,并且之后清除该属性。
- 尝试使用
rd 或rmdir 删除目录,但不要使用/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)仅复制已更改的文件。如果你清理旧目录,你应该确保首先复制整个文件夹。带时间戳的文件夹将仅包含修改后的文件(增量备份),因此如果您清理旧文件,您的备份/副本将不再完整!