BeatSaberの環境切り替えバッチファイル

BeatSaberのmod製作をする際に、通常のプレイ環境（現在だとmodの関係で1.29.1の古い環境がメイン）のバージョンと、modを開発したいバージョンが異なることが多いです。また、mod開発も複数のバージョンでチェックしたいなど、環境を切り替えるのも面倒です。

[bs-manager](https://github.com/Zagrios/bs-manager)のような便利なツールもありますが、独自のフォルダにインストールしてBeatSaberを直接起動する様なので、modのアセンブリ参照用のcsproj.userファイルは変更したくないため、手動でフォルダをリネームするバッチファイル作成しました。

あと、最近はmod開発環境だと最小限のmodでテストしたいので、ModAssistantも使わずに手動でmodやライブラリをインストールしています。あんまりツールで自動的に変更されると想定外のことが起きるので、環境切り替えも単純に行いたいというのもあります。
# 環境変更用バッチファイル
BeatSaberのインストールフォルダと、ユーザープロファイルにある設定フォルダを、メイン環境とテスト環境で切り替えます。

バッチファイルの引数にバージョンを指定すると、`Beat Saber_バージョン`のフォルダとリネームして入れ替えます。

バッチファイルのショートカットを作成して、バージョン毎にコマンドライン引数を設定してあげると使いやすいです。

リネーム対象のフォルダ有無もチェックして、間違った条件で実行されないようにしてあります。

バッチファイルで変更が必要な箇所は
`bs_inst_dir=BeatSaberのインストールパス`
で、インストール場所が異なる場合は変更します。

## 使い方
1. バッチファイルを適当なフォルダに作成
2. バッチファイルのショーットカットを作成して、プロパティのリンク先のバッチファイルのパスの末尾にバージョンの引数を追加
3. ユーザープロファイルの設定フォルダも`test`ではなく指定したい場合は、第2引数で設定します。（第2引数が未指定の場合は`test`)
4. バージョン事にショートカットを作成
5. `ユーザープロファイル\AppData\LocalLow\Hyperbolic Magnetism`のオリジナルの`Beat Saber`フォルダをコピーして`Beat Saber_test`にリネーム
6. 2～4で作成したバージョン毎にBeatSaberのインストールをして、フォルダ名を`Beat Saber_バージョン`にリネーム
7. 環境切り替えはショートカットを実行、対象のテストバージョンがあればメイン環境をテストに切り替え、なければテスト環境をメインに切り替え動作になります。

```
@echo OFF
setlocal
set bs_inst_dir=C:\Program Files (x86)\Steam\steamapps\common
set cfg_dir=%USERPROFILE%\AppData\LocalLow\Hyperbolic Magnetism
set test_bs_ver=%1
set test_bs_name=Beat Saber_%test_bs_ver%
set main_bs_name=Beat Saber_main
set org_bs_name=Beat Saber
if "%2"=="" (
    set test_cfg_name=Beat Saber_test
) else (
    set test_cfg_name=Beat Saber_%2
)
set main_cfg_name=Beat Saber_main
set org_cfg_name=Beat Saber
set test_bs="%bs_inst_dir%\%test_bs_name%\"
set main_bs="%bs_inst_dir%\%main_bs_name%\"
set org_bs="%bs_inst_dir%\%org_bs_name%\"
set test_cfg="%cfg_dir%\%test_cfg_name%\"
set main_cfg="%cfg_dir%\%main_cfg_name%\"
set org_cfg="%cfg_dir%\%org_cfg_name%\"
set now_bs_ver_file="%bs_inst_dir%\%org_bs_name%\BeatSaberVersion.txt"
if "%test_bs_ver%"=="" (
    echo バージョンを指定してください
    goto ERR_END
)
if exist %now_bs_ver_file% (
    echo 現在の環境のバージョンは
    type %now_bs_ver_file%
    echo です
)
if not exist %org_bs% (
    echo %org_bs%なし：例外のため実行しません
    goto ERR_END
)
if not exist %org_cfg% (
    echo %org_cfg%なし：例外のため実行しません
    goto ERR_END
)
if exist %test_bs% (
    call :RUN_YNCHECK "Ver%test_bs_ver%テスト環境へ移行しますか？[Y/N]:"
    if exist %main_bs% (
        echo %main_bs%あり：例外のため実行しません
        goto ERR_END
    )
    if exist %main_cfg% (
        echo %main_cfg%あり：例外のため実行しません
        goto ERR_END
    )
    if not exist %test_cfg% (
        echo %test_cfg%なし：例外のため実行しません
        goto ERR_END
    )
    echo BeatSaber Ver%test_bs_ver%：テスト環境に切り替えます
    ren %org_bs% "%main_bs_name%"
    call :ERR_CHECK %org_bs%
    echo 以下のフォルダをリネームしました
    echo %org_bs% → "%main_bs_name%"
    ren %test_bs% "%org_bs_name%"
    call :ERR_CHECK %test_bs%
    echo %test_bs% → "%org_bs_name%"
    ren %org_cfg% "%main_cfg_name%"
    call :ERR_CHECK %org_cfg%
    echo %org_cfg% → "%main_cfg_name%"
    ren %test_cfg% "%org_cfg_name%"
    call :ERR_CHECK %test_cfg%
    echo %test_cfg% → "%org_cfg_name%"
) else (
    call :RUN_YNCHECK "メイン環境へ移行しますか？[Y/N]:"
    if not exist %main_bs% (
        echo %main_bs%なし：例外のため実行しません
        goto ERR_END
    )
    if not exist %main_cfg% (
        echo %main_cfg%なし：例外のため実行しません
        goto ERR_END
    )
    if exist %test_cfg% (
        echo %test_cfg%あり：例外のため実行しません
        goto ERR_END
    )
    echo メイン環境に戻します
    ren %org_bs% "%test_bs_name%"
    call :ERR_CHECK %org_bs%
    echo 以下のフォルダをリネームしました
    echo %org_bs% → "%test_bs_name%"
    ren %main_bs% "%org_bs_name%"
    call :ERR_CHECK %main_bs%
    echo %main_bs% → "%org_bs_name%"
    ren %org_cfg% "%test_cfg_name%"
    call :ERR_CHECK %org_cfg%
    echo %org_cfg% → "%test_cfg_name%"
    ren %main_cfg% "%org_cfg_name%"
    call :ERR_CHECK %main_cfg%
    echo %main_cfg% → "%org_cfg_name%"
)
:ERR_END
pause
:BAT_END
endlocal
exit

:RUN_YNCHECK
    set /p yn_check=%1
    if not %yn_check:Y=Y%==Y goto BAT_END
    exit /b

:ERR_CHECK
    if %ERRORLEVEL% neq 0 (
        echo %1:フォルダのリネームでエラーになりました
        goto ERR_END
    )
    exit /b
```

BeatSaberのmod作成者向けの記事なので、簡易的な説明です。

こちらは、ChroMapperのプラグイン作成用の同様バッチファイルです。
使い方は同じです。
```
@echo OFF
setlocal enableDelayedExpansion
set cm_inst_dir=C:\TOOL\ChroMapper
set cfg_dir=%USERPROFILE%\AppData\LocalLow\BinaryElement
set test_cm_ver=%1
set test_cm_name=ChroMapper_%test_cm_ver%
set main_cm_name=ChroMapper_main
set org_cm_name=ChroMapper
if "%2"=="" (
    set test_cfg_name=ChroMapper_test
) else (
    set test_cfg_name=ChroMapper_%2
)
set main_cfg_name=ChroMapper_main
set org_cfg_name=ChroMapper
set test_cm="%cm_inst_dir%\%test_cm_name%\"
set main_cm="%cm_inst_dir%\%main_cm_name%\"
set org_cm="%cm_inst_dir%\%org_cm_name%\"
set test_cfg="%cfg_dir%\%test_cfg_name%\"
set main_cfg="%cfg_dir%\%main_cfg_name%\"
set org_cfg="%cfg_dir%\%org_cfg_name%\"
set now_cm_ver_file="%cm_inst_dir%\%org_cm_name%\cm-version"
if "%test_cm_ver%"=="" (
    echo バージョンを指定してください
    goto ERR_END
)
if exist %now_cm_ver_file% (
    for /f "usebackq delims=" %%a in (%now_cm_ver_file%) do (
        set "line=%%a"
        echo 現在の環境のバージョンは !line:~41,-1! です
    )
)
if not exist %org_cm% (
    echo %org_cm%なし：例外のため実行しません
    goto ERR_END
)
if not exist %org_cfg% (
    echo %org_cfg%なし：例外のため実行しません
    goto ERR_END
)
if exist %test_cm% (
    call :RUN_YNCHECK "Ver%test_cm_ver%テスト環境へ移行しますか？[Y/N]:"
    if exist %main_cm% (
        echo %main_cm%あり：例外のため実行しません
        goto ERR_END
    )
    if exist %main_cfg% (
        echo %main_cfg%あり：例外のため実行しません
        goto ERR_END
    )
    if not exist %test_cfg% (
        echo %test_cfg%なし：例外のため実行しません
        goto ERR_END
    )
    echo BeatSaber Ver%test_cm_ver%：テスト環境に切り替えます
    ren %org_cm% "%main_cm_name%"
    call :ERR_CHECK %org_cm%
    echo 以下のフォルダをリネームしました
    echo %org_cm% → "%main_cm_name%"
    ren %test_cm% "%org_cm_name%"
    call :ERR_CHECK %test_cm%
    echo %test_cm% → "%org_cm_name%"
    ren %org_cfg% "%main_cfg_name%"
    call :ERR_CHECK %org_cfg%
    echo %org_cfg% → "%main_cfg_name%"
    ren %test_cfg% "%org_cfg_name%"
    call :ERR_CHECK %test_cfg%
    echo %test_cfg% → "%org_cfg_name%"
) else (
    call :RUN_YNCHECK "メイン環境へ移行しますか？[Y/N]:"
    if not exist %main_cm% (
        echo %main_cm%なし：例外のため実行しません
        goto ERR_END
    )
    if not exist %main_cfg% (
        echo %main_cfg%なし：例外のため実行しません
        goto ERR_END
    )
    if exist %test_cfg% (
        echo %test_cfg%あり：例外のため実行しません
        goto ERR_END
    )
    echo メイン環境に戻します
    ren %org_cm% "%test_cm_name%"
    call :ERR_CHECK %org_cm%
    echo 以下のフォルダをリネームしました
    echo %org_cm% → "%test_cm_name%"
    ren %main_cm% "%org_cm_name%"
    call :ERR_CHECK %main_cm%
    echo %main_cm% → "%org_cm_name%"
    ren %org_cfg% "%test_cfg_name%"
    call :ERR_CHECK %org_cfg%
    echo %org_cfg% → "%test_cfg_name%"
    ren %main_cfg% "%org_cfg_name%"
    call :ERR_CHECK %main_cfg%
    echo %main_cfg% → "%org_cfg_name%"
)
:ERR_END
pause
:BAT_END
endlocal
exit

:RUN_YNCHECK
    set /p yn_check=%1
    if not %yn_check:Y=Y%==Y goto BAT_END
    exit /b

:ERR_CHECK
    if %ERRORLEVEL% neq 0 (
        echo %1:フォルダのリネームでエラーになりました
        goto ERR_END
    )
    exit /b
```

以上