[英]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
批处理文件首先创建一个本地环境。
接下来,它将当前目录的路径推送到堆栈上,并将批处理文件的目录设置为当前目录。 该批处理文件预计存储在包含子目录TheGame
和TheGameModed
的目录中。
然后执行命令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
是下一行,那么命令POPD和ENDLOCAL就不是必需的了。 我建议通常使用exit /B
或goto :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.