せっていちぅ。なうろーでぃんぐ。

【Steam版】Palworld Dedicated Serverでデータを自動バックアップする仕組み作った

友人がプレイする用の【Steam版】Palworld Dedicated Serverをサーバ用PCで運営していたのですが、知らない間に拠点が解体されちゃいました。

一定期間ログインしないと拠点が解体される仕様を私が知らず(プレイしてないからね…)、特にセーブデータをバックアップする仕組みを作っていなかったのです。

今更だけどセーブデータ自動バックアップの仕組み作ったので共有しようと思います。。。

 

全体的な概要

Windows Steam版での解説となりますが、SteamCMD版でも恐らく同じです。(Linux版はごめんなさい
今回のバックアップ処理は大まかに以下のように処理されます。

  1. 【bat処理】セーブデータを所定のフォルダへコピーする
  2. 【bat処理】セーブデータのファイル名に「yyyymmdd」を付与し、「yyyymmdd」フォルダを作成して移動する
  3. 【タスクスケジューラ処理】↑のbatを「①=30分毎」、「②=1日毎」で登録して自動実行する

bat処理はChatGPTに作ってもらいました。
あとはタスクスケジューラに登録して自動実行する仕組みを作ります。

我が家では24時間サーバ用PCが起動していますが、都度サーバ立ち上げしている方でも使えます。

【bat処理】セーブデータを所定のフォルダへコピーする

処理は以下からコピーしてメモ帳に貼り付けてください。
こちらの処理では[コピー元]、[コピー先]のフォルダを書き換える必要があります。

@echo off
setlocal enabledelayedexpansion

REM コピー元、コピー先フォルダを適切な場所に変更してください
set “sourceFolder=C:\Program Files (x86)\Steam\steamapps\common\PalServer\Pal\Saved\SaveGames\0\D8CC9B634E452374AD5D83B2AC245AC2\Players”
set “backupFolder=C:\Users\legte\Documents\スクリプト\PalWorld_Backup”

echo バックアップを開始します…

if not exist “%backupFolder%” mkdir “%backupFolder%”

for %%i in (“%sourceFolder%\*.sav”) do (
set “date=!date:~0,4!!date:~5,2!!date:~8,2!”
for /f “tokens=1-3 delims=: ” %%a in (‘time /t’) do (
set “time=%%a%%b”
)
set “newFileName=%%~ni_!date!_!time!%%~xi”
set “newFileName=!newFileName:_=!”
if not exist “%backupFolder%\!newFileName!” (
echo ファイル %%~nxi をバックアップ中…
copy “%%i” “%backupFolder%\!newFileName!” >nul
) else (
echo ファイル %%~nxi はすでに存在します。
)
)

echo バックアップが完了しました。
exit

コピー元フォルダ書き換え

C:\Program Files (x86)\Steam\steamapps\common\PalServer\Pal\Saved\SaveGames\0」までは共通です。
D8CC9B634E452374AD5D83B2AC245AC2」はPC毎に異なるので確認して書き換えてください。

コピー先フォルダ書き換え

コピー先はお好みの場所を指定してください。
我が家は「C:\Users\legte\Documents\スクリプト\PalWorld_Backup」としました。

コピー元、コピー先の書き換えが終わったら

書き換えが終わったらメモ帳を保存します。
この際拡張子は「.bat」になるように保存してください。(例:memo.txt→memo.bat)

【bat処理】セーブデータのファイル名に「yyyymmdd」を付与し、「yyyymmdd」フォルダを作成して移動する

処理は以下からコピーしてメモ帳に貼り付けてください。
こちらの処理では[コピー元]のフォルダを書き換える必要があります。

@echo off
setlocal enabledelayedexpansion

rem コピー元を書き換えてください
set “source_folder=C:\Users\legte\Documents\スクリプト\PalWorld_Backup”
set “extension=.sav”

rem フォルダ内にファイルが存在するか確認
dir /b “%source_folder%\*%extension%” > nul 2>&1
if errorlevel 1 (
echo No files found. Aborting script.
pause
exit /b
)

rem 日付を取得してyyyymmdd形式に変換
for /f %%i in (‘powershell -Command “Get-Date -Format yyyyMMdd”‘) do set “backup_folder=%source_folder%\%%i”

rem フォルダが存在しない場合は作成
if not exist “%backup_folder%” mkdir “%backup_folder%”

rem 実行日時の取得
for /f “tokens=2 delims==.” %%a in (‘wmic OS Get localdatetime /value’) do set “datetime=%%a”
set “timestamp=!datetime:~0,4!!datetime:~4,2!!datetime:~6,2!!datetime:~8,2!!datetime:~10,2!!datetime:~12,2!”

rem 条件に従ってファイルを移動
for %%F in (“%source_folder%\*%extension%”) do (
for %%a in (“%%~tF”) do set “filetimestamp=%%~ta”
set “filetimestamp=!filetimestamp: =0!”
set “filetimestamp=!filetimestamp:~0,4!!filetimestamp:~5,2!!filetimestamp:~8,2!!filetimestamp:~11,2!!filetimestamp:~14,2!!filetimestamp:~17,2!”

if !filetimestamp! LSS !timestamp! (
move “%%F” “!backup_folder!”
echo Moved “%%~nxF” to “!backup_folder!”
)
)

endlocal

コピー元フォルダ書き換え

「【bat処理】セーブデータを所定のフォルダへコピーする」で作成しているコピー先フォルダで書き換えます。
「set “source_folder=C:\Users\legte\Documents\スクリプト\PalWorld_Backup“」赤文字の箇所を書き換えてください。

我が家の場合はC:\Users\legte\Documents\スクリプト\PalWorld_Backupですね。

bat実行時の見え方サンプル

↑で作成した2種類のbatを実行した場合の見え方はこんな感じです。

【タスクスケジューラ処理】batを「①=30分毎」、「②=1日毎」で登録して自動実行する

↑で作成したbatを自動実行できるように仕組みを作りのためにタスクスケジューラに登録します。以下の手順でタスクスケジューラを起動してください。

Windows デスクトップ画面でキーボードの[Windows]+[R]キーを同時に押します。
実行ダイアログで「taskschd.msc」を入力してOK

タスクスケジューラでスケジュール登録する

作成したbatを自動起動してバックアップできるようにします。
以下の手順は30分毎にバックアップする設定の場合で解説しますが、1日毎の場合は一部値を変更するだけです。

右側「タスクの作成…」をクリックして作成画面を起動してください。
以下の通り設定していきます。


[全般]
名前:任意の名前
説明:任意の説明


[トリガー]-[新規(N)…]
タスクの開始:スケジュールに従う
設定:1回
繰り返し間隔:30分間 (※1日毎も可能
継続時間:無期限
有効:☑


[操作]-[新規(N)…]
操作:プログラムの開始
プログラム/スクリプト:作成したbatのファイルパス


条件
特になし


[設定]
タスクを要求時に実行する:☑
スケジュールされた時刻にタスクを開始で出来なかった場合、すぐにタスクを実行する:☑
タスクが失敗した場合の再起動の間隔:5分間
再起動思考の最大数:1回
要求時に実行中のタスクが終了しない場合、タスクを強制的に終了する:☑


[履歴]
特になし

まとめ

それぞれの処理の詳細を記載しておきますね。

【bat処理】セーブデータを所定のフォルダへコピーする
1.コピー元、コピー先を定義
2.コピー元から「.sav」を確認してコピー
3.コピーした際に「yyyymmdd」をファイル末尾に付与

【bat処理】セーブデータのファイル名に「yyyymmdd」を付与し、「yyyymmdd」フォルダを作成して移動する
1.コピー元、コピーファイル(.sav)を定義
2.「.sav」の存在を確認し、なければ処理を中止。あれば続行
3.「yyyymmdd」でフォルダを作成
4.「.sav」のタイムスタンプが作成フォルダより前であれば移動する