复制文件而不覆盖

我似乎不能在命令行中找到一种方法来说“将所有文件从目录 A 复制到目录 B,但是如果文件已经存在于目录 B 中,不要覆盖它,不管哪个文件比较新,也不要提示我。”

我经历了拷贝、移动、 xcopy 和机器人拷贝,最接近的方法是你可以告诉机器人拷贝“拷贝 A 到 B,但不要用旧文件覆盖新文件”,但这对我不起作用。我查看了 xxcopy,但是放弃了它,因为我不希望第三方依赖于 Visual Studio 后期构建事件,这将需要其他 SVN 用户安装该工具来进行构建。

我想在 Visual Studio 2010的后期构建事件中添加一个命令行,这样新的 EF模型对象的 T4模板生成的文件就可以分发到它们所属的项目文件夹中,但是现有对象的重新生成的文件不会覆盖可能编辑的目标文件。

由于 T4模板重新生成,源文件总是更新,我不认为我能可靠地使用“更新”开关。

对于那些我可以使用分部类的条目,我使用分部类,但是我生成的其他东西不能使用分部类(例如,生成默认的 EditorTemplate 或 DisplayTemplate *)。Ascx 文件)。

有人解决过类似的问题吗?

239405 次浏览
For %F In ("C:\From\*.*") Do If Not Exist "C:\To\%~nxF" Copy "%F" "C:\To\%~nxF"

Robocopy or "Robust File Copy", is a command-line directory replication command. It has been available as part of the Windows Resource Kit starting with Windows NT 4.0, and was introduced as a standard feature of Windows Vista, Windows 7 and Windows Server 2008.

   robocopy c:\Sourcepath c:\Destpath /E /XC /XN /XO

详细说明(使用 Hydrgyrum,HailGallaxar 和 Andy Schmidt 的回答) :

  • /E使 Robocopy 递归地复制子目录, including empty ones.
  • 排除现有文件 同样的时间戳,但不同 Robocopy 通常会覆盖这些文件大小。
  • /XN排除较新的现有文件 比目的地中的副本更重要 正常情况下机器复制 覆盖那些。
  • /XO不包括 existing files older 比目的地中的副本更重要 正常情况下机器复制 覆盖那些。

排除了 Changed、 Older 和 Newer 类之后,Robocopy 可以完全按照原始发布者的要求进行操作——无需加载脚本环境。

参考文献: Technet维基百科
下载地址: 微软下载链接 < em > (链接最后验证于2016年3月30日)

以下是批处理文件格式:

@echo off
set source=%1
set dest=%2
for %%f in (%source%\*) do if not exist "%dest%\%%~nxf" copy "%%f" "%dest%\%%~nxf"

贝利萨留斯的解决方案很好。

为了详细说明这个略显简短的答案:

  • /E makes Robocopy recursively copy subdirectories, 包括空的。
  • 排除现有文件 同样的时间戳,但不同 Robocopy 通常会覆盖这些文件大小。
  • /XN排除较新的现有文件 而不是来源的副本 正常情况下机器复制 覆盖那些。
  • /XO不包括 现有的旧文件 而不是来源的副本 正常情况下机器复制 覆盖那些。

排除了 Changed、 Older 和 Newer 类之后,Robocopy 可以完全按照原始发布者的要求进行操作——无需加载脚本环境。

Robocopy 可以在这里下载,用于尚未安装 Robocopy 的系统(即 WindowsServer2003)

Http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=17657 (no reboot required for installation)

Remember to set your path to the robocopy exe. You do this by right clicking "my computer"> properties>advanced>"Environment Variables", then find the path system variable and add this to the end: ";C:\Program Files\Windows Resource Kits\Tools" or wherever you installed it. Make sure to leave the path variable strings that are already there and just append the addtional path.

一旦路径设置好,你就可以运行 Belisarius 建议的命令。

我只是想从我自己的测试中澄清一些事情。

@ Hydragyrum 写道:

  • /XN 排除比源目录中的副本更新的现有文件。 Robocopy 通常会覆盖这些文件。
  • /XO 排除源目录中比复制更旧的现有文件。 Robocopy 通常会覆盖这些文件。

这实际上是反过来的。XN 执行“排除更新的”文件,但是它排除比 destination目录中的副本更新的文件。XO 执行“排除旧文件”,但它排除的文件比 destination目录中的副本旧。

当然,您可以像往常一样进行自己的测试。

你可以试试这个:

echo n | copy /-y <SOURCE> <DESTINATION>

-y只是在覆盖之前提示,我们可以通过管道来回答所有这些问题。所以这实际上就是复制不存在的文件。:)

使用 xcopy 有一种奇怪的方法:

echo nnnnnnnnnnn | xcopy /-y source target

Just include as many n's as files you're copying, and it will answer n to all of the overwrite questions.

它不允许我直接对不正确的消息进行评论——但是让我提醒大家,与之前的消息相比,/XN 和/XO 选项的定义是反向的。

排除旧/新文件选项与 RoboCopy 日志记录中显示的信息一致: RoboCopy 将遍历 SOURCE,然后报告 SOURCE 中的每个文件是“ OLDER”还是“ NEWER”,而不是目标文件。

因此,/XO 将排除 OLDER SOURCE 文件(这是直观的) ,而不是像这里声明的那样“比源文件还旧”。

如果只想复制新的或更改过的源文件,但避免替换更新的目标文件,那么/XO 是正确的选项。

一个简单的方法是使用/MIR 选项来镜像这两个目录。基本上,它只会将新文件复制到目的地。在下一个命令中,将源文件和目标文件替换为文件夹的路径,脚本将搜索具有任何扩展名的任何文件。

robocopy <source directory> <destination directory> *.* /MIR

我就是这么做的。我使用这个来“添加”文件到另一个驱动器,没有覆盖。

批处理文件: robocopy-missingfiles. bat

@echo off
echo Copying
echo      "%1"
echo   to "%2"
echo.
echo Press Cntr+C to abort
Pause
echo.
@echo on
robocopy %1 %2 /Xo /XN /XC /J /SL /S /MT:8 /R:1 /W:1 /V /DCOPY:DAT /ETA /COPY:DATO /FFT /A-:SH /XD $RECYCLE.BIN "System Volume Information"

例如:

robocopy-missingfiles.bat f:\Working-folder\ E:\Backup-folder\

在实现之前进行测试。

robocopy src dst /MIR /XX

/XX: 排除“ eXtra”文件和目录(目标文件中有,但源文件中没有)。这将防止从目标删除任何内容。(这是默认情况)

我们可以使用 XCOPY 命令将文件从源文件夹复制到目标文件夹,而无需覆盖目标目录中的任何现有文件。

首先使用 xcopy 选项/L/U/Y 获取目标文件中已经存在的文件名列表,并将其写入临时文件 ExcludeFiles.txt 中。

然后再次使用 XCOPY command with /EXCLUDE: option并提供包含需要排除的文件名列表的文件路径。 创建一个批处理文件,命令“ Copy-Files。蝙蝠”下面的内容和享受!如果要请求用户输入源目录和目标目录路径,请进行修改。

@echo off
set source="C:\Dir1"
set destination="C:\Dir2"


echo Copying non-existing files. NO OVERWRITE!


xcopy %source% %destination% /L/U/Y > %TEMP%\ExcludeFiles.txt
xcopy %source% %destination% /EXCLUDE:%TEMP%\ExcludeFiles.txt
pause