繁体   English   中英

仅批处理 xcopy 目标中不存在的文件

[英]batch xcopy only files that are not present in destination

-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文件夹仅包含“修改过的文件”,并且想要制作一个批处理,该批处理将从游戏文件夹中复制目标中尚不存在的文件(即使不存在相同)

这是正确的吗 :
xcopy "../TheGame" "../TheGameModed" /q /s /e

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

我发现只有这个:

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

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

也许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

批处理文件首先创建一个本地环境

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

然后执行命令DIR输出

  • 由于/AD (属性不是目录),所有文件的名称
  • 仅因为/B (裸格式)而具有文件名
  • 在指定目录TheGame和所有子目录中因为/S
  • 并且由于/S也具有完整路径。

DIR命令行在FOR在后台使用cmd.exe /C启动的单独命令进程中执行,该命令进程分别捕获由该命令进程写入的所有内容,分别由DIR处理STDOUT

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

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

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

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

TheGame目录树中获得当前文件的目标路径后,接下来检查该路径中具有该名称的文件是否已存在于TheGameModed目录树中。

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

在处理完TheGame目录树中的所有文件后,在退出当前命令进程之前从堆栈以及初始环境中恢复初始当前目录,这与调用层次结构和命令进程最初是如何启动的无关。

如果exit是下一行,那么命令POPDENDLOCAL就不是必需的了。 我建议通常使用exit /Bgoto :EOF而不是EXIT ,但是如果未启用命令扩展名,则goto :EOF会失败,并且我们不能 100% 确定在启动批处理文件时启用了命令扩展名,尽管默认情况下在 Windows 上启用了命令扩展。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM