Minecraft Windows Server 2022 下 自动备份数据

我的环境

系统:Windows Server 2022 DataCenter(桌面环境)

服务端:fabirc 1.25.5

需要的软件:

  • mcrcon
  • 打开rcon
  • 7zip

备份代码

创建一个txt,或者直接创建一个bat,然后记得修改环境部分的变量内容为您自己的信息

@echo off
setlocal ENABLEDELAYEDEXPANSION

:: ====== 配置路径 ======
REM 具体注释请看博文代码区块下面的解释部分
set "SERVER_DIR="
set "BACKUP_DIR="
set "TEMP_DIR=%BACKUP_DIR%\tmp"
set "ZIP_EXE=C:\Program Files\7-Zip\7z.exe"
set "MCRCON_EXE=mcrcon.exe"
set "RCON_HOST=localhost"
set "RCON_PORT=25575"
set "RCON_PASSWORD="
set "LOG_FILE=%BACKUP_DIR%\backup_log.txt"

:: ====== 生成时间戳(通用格式)======
for /f "tokens=2 delims==." %%a in ('"wmic os get LocalDateTime /value"') do set ldt=%%a
set YYYY=%ldt:~0,4%
set MM=%ldt:~4,2%
set DD=%ldt:~6,2%
set HH=%ldt:~8,2%
set MIN=%ldt:~10,2%
set "TIMESTAMP=%YYYY%-%MM%-%DD%_%HH%-%MIN%"
set "ZIP_NAME=backup_%TIMESTAMP%.zip"
set "ZIP_PATH=%BACKUP_DIR%\%ZIP_NAME%"

:: ====== 日志开始 ======
echo. >> "%LOG_FILE%"
echo [%YYYY%-%MM%-%DD% %HH%:%MIN%] === 开始执行备份任务 === >> "%LOG_FILE%"

:: ====== 通知:开始备份 ======
%MCRCON_EXE% -H %RCON_HOST% -P %RCON_PORT% -p %RCON_PASSWORD% ^
    "tellraw @a [{\"text\":\"[系统] \",\"color\":\"gold\"},{\"text\":\"服务器即将备份,请暂时停止操作。\",\"color\":\"yellow\"}]"

:: ====== 强制保存游戏数据 ======
%MCRCON_EXE% -H %RCON_HOST% -P %RCON_PORT% -p %RCON_PASSWORD% "save-off"
%MCRCON_EXE% -H %RCON_HOST% -P %RCON_PORT% -p %RCON_PASSWORD% "save-all"
ping -n 2 127.0.0.1 > nul

:: ====== 清理旧临时目录 ======
if exist "%TEMP_DIR%" (
    echo 清理旧临时目录中... >> "%LOG_FILE%"
    rmdir /s /q "%TEMP_DIR%"
)
mkdir "%TEMP_DIR%"

:: ====== 临时复制核心数据 ======
echo 正在复制 world ... >> "%LOG_FILE%"
robocopy "%SERVER_DIR%\world" "%TEMP_DIR%\world" /E /R:0 /W:0 /XF session.lock

echo 正在复制 mods ... >> "%LOG_FILE%"
robocopy "%SERVER_DIR%\mods" "%TEMP_DIR%\mods" /E /R:0 /W:0

echo 正在复制 config ... >> "%LOG_FILE%"
robocopy "%SERVER_DIR%\config" "%TEMP_DIR%\config" /E /R:0 /W:0

echo 正在复制 server.properties 等 ... >> "%LOG_FILE%"
robocopy "%SERVER_DIR%" "%TEMP_DIR%" server.properties ops.json whitelist.json /R:0 /W:0

:: ====== 压缩临时目录到 ZIP ======
echo 开始压缩 %ZIP_NAME% ... >> "%LOG_FILE%"
"%ZIP_EXE%" a -tzip "%ZIP_PATH%" "%TEMP_DIR%\*" -mx5 -bb1 >> "%LOG_FILE%" 2>&1
set ZIP_RESULT=%ERRORLEVEL%

:: ====== 判断压缩结果 ======
if %ZIP_RESULT% LEQ 1 (
    echo [%TIMESTAMP%] ✅ 备份成功(含警告码 %ZIP_RESULT%):%ZIP_NAME% >> "%LOG_FILE%"
) else (
    echo [%TIMESTAMP%] ❌ 备份失败(错误码:%ZIP_RESULT%) >> "%LOG_FILE%"
    goto CLEANUP
)

:: ====== 清理临时目录 ======
:CLEANUP
echo 正在清理临时目录 ... >> "%LOG_FILE%"
rmdir /s /q "%TEMP_DIR%"

:: ====== 恢复保存 + 通知 ======
%MCRCON_EXE% -H %RCON_HOST% -P %RCON_PORT% -p %RCON_PASSWORD% "save-on"
%MCRCON_EXE% -H %RCON_HOST% -P %RCON_PORT% -p %RCON_PASSWORD% ^
    "tellraw @a [{\"text\":\"[系统] \",\"color\":\"gold\"},{\"text\":\"服务器备份完成,感谢配合。\",\"color\":\"green\"}]"

:: ====== 日志结尾 ======
echo [%TIMESTAMP%] === 备份任务完成 === >> "%LOG_FILE%"
pause
endlocal

变量解释

变量名解释
SERVER_DIR服务端存放的位置
BACKUP_DIR服务端备份存放的位置
TEMP_DIR在程序设计中,为了防止因为打包时,突然出现独占锁
或者占用导致数据保存失败不过一般不需要进行配置,
默认是在BACKUP_DIR下面创建一个tmp目录进行保存
ZIP_EXE7zip执行文件的路径,需要使用绝对路径
MCRCON_EXE用于定位MCRCON的位置(很重要,用于跟服务端进行通信)
RCON_HOSTRCON协议服务器地址,一般是localhost
RCON_PORTRCON协议服务器端口
RCON_PASSWORDRCON协议密码
LOG_FILE日志存放路径

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容