現在、iPhoneやiPadでMinecraft(以下マイクラ)を楽しんでいますが、アプリを自動アップデートしていると、自宅に建てているWindows用のマイクラ統合版サーバー(Bedrock Server)側とのバージョンの違いで、接続できないことが多々あります。
その際、主に利用者からクレームを受けて、サーバー側のバージョンを手動アップデートしているのですが、すぐに対応できる状況じゃないと利用者を待たせることになるので一苦労(汗)。
そこで、WindowsのPowerShellとタスクスケジューラーを使った、マイクラ統合版(BE)サーバーの自動アップデートスクリプトを作成したので公開します!
マイクラ統合版の自動アップデート
マイクラ統合版サーバー(Bedrock Server)には、Windows版とUbuntu(Linux)版が用意されています。
Ubuntu版には便利なシェルスクリプトが公開されているので、特に気にせず自動アップデートできるのですが、Windows版は探しまくってもすぐ使えるようなものは全く見つかりませんでした。。
海外のサイトで唯一使えそうな情報があったので、そちらを参考に少し改造して完成させました!
PowerShellで最新版にアップデート
今回のスクリプトを使ったアップデート時にやることは、
- ダウンロードリンクの取得と最新バージョンの確認
- 起動中のBedrock Serverの停止
- 設定ファイルのバックアップ
- 最新版Bedrock Serverのダウンロード
- ダウンロードしたBedrock Serverの展開
- バックアップした設定ファイルを戻す
- Bedrock Serverの起動
ザックリこのような流れです。
まずは完成したPowerShellのスクリプトを貼り付けます。
後ほど簡単に内容の解説と参考サイトとの違いだけご紹介したいと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
$gameDir = "C:\bedrock" cd $gameDir [Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls" (Invoke-WebRequest -Uri https://minecraft.net/en-us/download/server/bedrock/).Content -match "<a href=""(.*.zip).*?"">" $url = $Matches[1] $filename = $url.Replace("https://minecraft.azureedge.net/bin-win/","") $filename $url = "$url" $output = "$gameDir\$filename" $output if(!(get-item $output)){ Stop-Process -name "bedrock_server" # DO AN BACKUP OF CONFIG New-Item -ItemType Directory -Name backup Copy-Item -Path "server.properties" -Destination backup Copy-Item -Path "whitelist.json" -Destination backup Copy-Item -Path "permissions.json" -Destination backup $start_time = Get-Date Invoke-WebRequest -Uri $url -OutFile $output Write-Output "Time taken: $((Get-Date).Subtract($start_time).Seconds) second(s)" Expand-Archive -LiteralPath $output -DestinationPath $gameDir -Force # RECOVER BACKUP OF CONFIG Copy-Item -Path ".\backup\server.properties" -Destination .\ Copy-Item -Path ".\backup\whitelist.json" -Destination .\ Copy-Item -Path ".\backup\permissions.json" -Destination .\ } if(!(get-process -name bedrock_server)){ Start-Process "bedrock_server.exe" } exit |
ちなみに、このスクリプトはGithubでも公開していますので、ダウンロードして自由にお使いください。
使い方についてもこちらをご参照ください。
解説と参考サイトとの違い
0. インストール先の指定
最初から解説していきます。
まず、このPowerShellを使用する際に唯一変更する箇所は、1行目の$gameDir
のパラメータのみです。
ここにBedrock Serverのインストールフォルダを指定します。
1. ダウンロードリンクの取得と最新バージョンの確認
ここが参考サイトと異なる部分になります。
参考サイトでは以下のように、Invoke-WebRequest
でマイクラ公式のBedrock Serverダウンロードページの情報からLinks
でダウンロードリンクを取得していますが、デバッグしながらやってみると、Links
の項目はなぜか空になってました。
1 2 3 4 |
# 改良前 $result = Invoke-WebRequest -Uri https://minecraft.net/en-us/download/server/bedrock/ $serverurl = $result.Links | select href | where {$_.href -like "https://minecraft.azureedge.net/bin-win/bedrock-server*"} $url = $serverurl.href |
そこで、Content
の情報からダウンロードリンクを取得するよう改造しました!
さらに、ダウンロードリンクの検索には-match
を使って、HTMLのアンカータグにあるhrefの値の末尾に.zipが付くのもを抽出しています。
1 2 3 |
# 改良後 (Invoke-WebRequest -Uri https://minecraft.net/en-us/download/server/bedrock/).Content -match "<a href=""(.*.zip).*?"">" $url = $Matches[1] |
あとは参考サイトと同じようにReplaceして、最新版Bedrock ServerのZIPファイル名が取得できました!
2. 起動中のBedrock Serverの停止
この行で、インストールフォルダに先程取得したZIPファイルが存在するか確認します。
1 |
if(!(get-item $output)){ |
存在したら何もしない、存在しなかったらバージョンアップを実行します。
1 |
Stop-Process -name "bedrock_server" |
でBedrock Serverを停止。
3. 設定ファイルのバックアップ
1 |
New-Item -ItemType Directory -Name backup |
で設定ファイルのバックアップ先フォルダ(backup)を作成し、
1 2 |
Copy-Item -Path "server.properties" -Destination backup ・・・ |
で展開した際に上書きされないよう設定ファイルをbackupフォルダへ退避。
4. 最新版Bedrock Serverのダウンロード
1 |
Invoke-WebRequest -Uri $url -OutFile $output |
1.で取得した最新版のダウンロードリンクから、Bedrock ServerのZIPファイルをダウンロード。
5. ダウンロードしたBedrock Serverの展開
1 |
Expand-Archive -LiteralPath $output -DestinationPath $gameDir -Force |
でBedrock ServerのインストールフォルダにZIPファイルを解凍&展開。
6. バックアップした設定ファイルを戻す
1 2 |
Copy-Item -Path ".\backup\server.properties" -Destination .\ ・・・ |
3.でbackupフォルダにバックアップしておいた設定ファイルを元に戻して…
7. Bedrock Serverの起動
1 |
Start-Process "bedrock_server.exe" |
でBedrock Serverを起動すれば完了!
最後はプロセスが残らないようexit
で終了、という流れです。
タスクスケジューラーでPowerShellの実行
完成したPowerShellを定期的に実行するよう、タスクスケジューラーに登録します。
実はこれが少し厄介で、タスクスケジューラーでPowerShellのスクリプトを実行させる場合、単純に.ps1ファイルを指定するのでは上手くいきませんでした。
話を進める前に、タスクスケジューラーの基本はこちらで確認しておいてくださいね。
PowerShellを1時間毎に実行する
今回はトリガーを細かく設定しますので、まずはタスクスケジューラーを開き、「基本タスクの作成」ではなく「タスクの作成」を選択してください。
左端の「全般」タグから順を追って説明します。
全般
ここはそれぞれ実行する端末の環境によって異なるので、自分で最適だと思う「セキュリティ オプション」を設定してください。
ここの設定も間違えるとタスクは動きません。
よくネットの情報では、「ユーザーがログオンしているかどうかにかかわらず実行する」や「最上位の特権で実行する」にもチェックを入れることが多く推奨されているようですが、著者の環境では、「ユーザーがログオンしているときのみ実行する」でないと動きませんでした。
これは、著者の環境がネットワークドライブにBedrock Serverのインストールフォルダがあるからではないかと思います。
もし、タスクを実行してみて動かなければ、ここの設定を変えてみることも視野に入れておいてください。
トリガー
トリガーでは、いつ、どのような間隔でPowerShellを実行するかを決めます。
今回の例では1時間毎に実行したいのですが、「設定」の項目には1回、毎日、毎週、毎月しかありません。
そこで、「設定」の項目では「1回」を選択し、「詳細設定」の方で1時間毎になるようにします。
「詳細設定」の「繰り返し間隔」を「1時間」で設定し、右隣の「継続時間」を「無制限」にします。
これで、1時間毎に永遠に実行するタスクが実現できます。
操作
さて、ここが1番の悩みでした。
普通なら「プログラム/スクリプト」に今回のPowerShellで作った.ps1のスクリプトファイルを設定するだけで良さそうなのですが、PowerShellの場合は一味違います。
以下のように設定してください。
プログラム/スクリプト |
※PowerShell本体のフルパス | ||
---|---|---|---|
引数の追加 |
※PowerShell本体の引数として、.ps1を実行 | ||
開始 |
※.ps1を配置しているフォルダパス |
この設定の意味は、.ps1のスクリプトファイルを直接実行するのではなく、PowerShell本体から.ps1を実行しています。
このように設定しないと動きません!
その他のタブ
その他にも「条件」や「設定」タブがありますが、ここでは説明を割愛します。
それぞれの環境に合わせてご自身で設定してください。
タスクスケジューラーの設定は以上です。
できたら試しに「実行」をクリックして動作が正常かどうか確認してください。
お疲れ様でした!
コメント
コメント一覧 (1件)
つい先日この記事を拝見して、設定させていただきましたがうまく動作しませんでした。
ログを見る限りは
(Invoke-WebRequest -Uri https://minecraft.net/en-us/download/server/bedrock/.Conten)t -match “”
$url = $Matches[1]
ここから先の処理が進んでいないようですが、何か対応方法ございますでしょうか