批量xcopy仅限目标中不存在的文件

时间:2017-12-01 20:28:35

标签: windows batch-file

-TheGame/
     - Game files/
             -> file1.whatever
             -> file2.whatever
             -> file3.whatever
     -> Launcher.exe

 -TheGameModed/
     - Game files/
             -> file1.whatever        (the moded file)
     -> Launcher.exe                  (the moded launcher)

我在游戏中制作了一个mod,我想为人们创建一个安装程序来玩我的游戏。 为了防止备份问题(如果玩家想要恢复到香草),我会将mod文件夹放在游戏文件夹旁边。 mod文件夹仅包含"模式文件"并且想要制作一个批次,它将从游戏文件夹中复制目的地中尚未存在的文件(即使它们不相同)

这是对的:
xcopy "../TheGame" "../TheGameModed" /q /s /e

这里有文档,但我找不到我要找的东西: https://www.computerhope.com/xcopyhlp.htm

我发现只有这个:

  

/ U仅复制目标中已存在的文件。   但我需要相反(仅复制目标中不存在的文件)

P.S。 :当批量复制文件时,它会问我是否要覆盖,因为我只有很少的文件并不是很难输入n次。但如果有人输入y(那会很糟糕)并且下一个mod会包含更多文件,mod将被删除:[

1 个答案:

答案 0 :(得分:1)

可能无法使用 ROBOCOPY ,因为游戏更新批处理文件也适用于Windows XP。在这种情况下,以下批处理文件可能可用于Windows NT4和所有更高版本的Windows版本:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
pushd "%~dp0"
for /F "delims=" %%I in ('dir "TheGame\*" /A-D /B /S 2^>nul') do call :CopyFile "%%I"
popd
endlocal
exit

:CopyFile
set "SourcePath=%~dp1"
set "TargetPath=%SourcePath:\TheGame\=\TheGameModed\%"
if not exist "%TargetPath%%~nx1" %SystemRoot%\System32\xcopy.exe "%~1" "%TargetPath%" /C /I /Q >nul
goto :EOF

批处理文件首先创建local environment

接下来,它会在堆栈上推送当前目录的路径,并将批处理文件的目录设置为当前目录。此批处理文件需要存储在包含子目录TheGameTheGameModed的目录中。

然后执行命令 DIR 以输出

  • /A-D(属性不是目录)
  • 而导致的所有文件的名称
  • 仅因/B(裸格式)
  • 而使用文件名 由于TheGame ,指定目录/S中的
  • 和所有子目录
  • 并且还有完整路径,因为/S

这个 DIR 命令行在一个单独的命令进程中执行,该进程由 FOR 在后台启动,cmd.exe /C分别捕获由此命令进程写入的所有内容。 strong> DIR 来处理 STDOUT

阅读有关Using Command Redirection Operators的Microsoft文章,了解2>nul的说明。重定向运算符>必须使用 FOR 命令行上的插入符^进行转义,以便在执行命令之前Windows命令解释程序处理此命令行时将其解释为文字字符FOR ,它在后台启动的单独命令进程中执行 DIR 命令行。

FOR 选项delims=禁用使用空格/制表符作为分隔符将不以分号开头的每个非空行拆分为字符串的标准行为。换句话说,具有文件扩展名和完整路径的每个文件名都分配给循环变量I

具有文件扩展名和完整路径的每个文件的名称将传递给名为CopyFile的子例程。

子例程首先将TheGame目录树中找到的源文件路径仅分配给环境变量SourcePath。接下来,字符串替换用于在此路径TheGame中替换TheGameModed,并在两侧包含目录分隔符以提高准确性。

TheGame目录树中拥有当前文件的目标路径后,如果TheGameModed目录树中已存在该路径中具有该名称的文件,则会检查该目标路径。

如果文件不存在,则使用命令 XCOPY 将此单个文件复制到TheGameModed,并在必要时自动创建整个目录树。 XCOPY 的目录创建功能是使用 XCOPY 而非 COPY 的主要原因。

在处理TheGame目录树中的所有文件之后,初始当前目录将从堆栈以及初始环境中恢复,然后退出当前命令进程,而不依赖于调用层次结构以及命令进程最初是如何启动的。

exit作为下一行时,命令 POPD ENDLOCAL 不是必需的。我建议通常使用exit /Bgoto :EOF代替退出,但如果未启用命令扩展,则goto :EOF会失败,我们无法100%确定虽然默认情况下在Windows上启用了命令扩展,但在启动批处理文件时启用了命令扩展。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • call /?
  • echo /?
  • endlocal /?
  • exit /?
  • goto /?
  • if /?
  • popd /?
  • pushd /?
  • set /?
  • setlocal /?
  • xcopy /?