【问题标题】:batch xcopy only files that are not present in destination仅批处理 xcopy 目标中不存在的文件
【发布时间】:2017-12-01 20:28:34
【问题描述】:
-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 文件夹仅包含“moded 文件”,并且想要制作一个批处理,该批处理将从游戏文件夹中复制目标中尚不存在的文件(即使不存在相同)

这样对吗:
xcopy "../TheGame" "../TheGameModed" /q /s /e

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

我只找到了这个:

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

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

【问题讨论】:

  • 你应该使用/Y : Suppresses prompting to confirm you want to overwrite an existing destination file.
  • echo N|xcopy "../TheGame" "../TheGameModed" /q /s /e
  • @Hackoo - 这将默默地覆盖现有文件 - 与查询者的期望完全相反。
  • 需要注意的是,XCOPY 已被严重弃用;你应该考虑使用ROBOCOPY,它有完全不同的选项。
  • @MisterAqua - 检查ROBOCOPY File Selection Options examples ROBOCOPY [file...] [选项] robocopy "C:\Source Folder*.*" "D:\Destination Folder*.*" /xx /xx Excludes extra files that exist in the destination directory

标签: windows batch-file


【解决方案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命令行在一个单独的命令进程中执行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目录树中的所有文件后,在退出当前命令进程之前从堆栈以及初始环境中恢复初始当前目录,独立于调用层次结构和命令进程最初是如何启动的。

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

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

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

【讨论】:

    猜你喜欢
    • 2021-10-04
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多