Mod用のdllファイルをコピー後, ソフトを自動的に起動するバッチファイルの作成 (Windowsでドライブ間の移動を伴う)

# 前提条件
## 背景
- 「ビルドした際にビルドしたファイルを別のフォルダにコピーし, コピー先のソフトを自動起動したい」という要望が入った為作成した。
  - ビルドするファイル => AmongUsのMod
  - 起動するソフト => AmongUs

## 環境
- windows10 及び 11

#### 各ファイルが存在する 及び 環境変数で指定されているドライブ
| ファイルおよび環境変数(フォルダ) | 役割 | 該当ドライブ |
|:--|:--|:--:|
| バッチファイル |  | C |
| %Develop% | プロジェクトファイルが存在しているフォルダ | E |
| %AmongUs% | build先のフォルダ | C |
| %AmongUs%\BepInEx\plugins\SuperNewRoles.dll | [*1]<br>ビルドしたコピー対象のファイル (Modのdll) | C |
| %AmongUsTest% | 起動したいソフト(Among Us)が存在するフォルダ | C |
| %AmongUsTest%\BepInEx\plugins | [*1]のコピー先のフォルダ | C |

# コード
## 全文
```bat
@chcp 65001
@echo off

pushd %Develop%
dotnet build

if %errorlevel%==0 ( GOTO :Success ) else ( GOTO :Miss )

:Success
echo +-------------------------------------------------+
echo    buildに成功しました
echo    ファイルをテストフォルダにコピーして, 起動します
echo +-------------------------------------------------+

copy /y "%AmongUs%\BepInEx\plugins\SuperNewRoles.dll" "%AmongUsTest%\BepInEx\plugins"
start "" "%AmongUsTest%\Among Us"
pause
exit
rem End :Success

:Miss
echo +----------------------------+
echo    buildエラーが発生しました
echo +----------------------------+
pause
rem End :Error

```

## 実行内容
1. 環境変数で指定している, ビルドを行うフォルダに移動する。
2. ビルドを実行する。
3. ビルドが成功したか判定する。
4. 3が成功していた場合 ファイルをコピーし, 失敗していた場合バッチファイルの実行を停止する。
5. コピー先のフォルダのAmongUsを起動する。
6. 入力待機し, 入力されたらバッチファイルの実行を終了する。

## 説明
### 前提記事
- [buildした後に, buildエラーが発生していなかった場合 対象のソフトを自動的に起動するバッチファイルの作成](https://qiita.com/Kurato-Tsukishiro/items/b562e7e9e4409960dc2f)
  - 此処で記載済みの内容の説明は省略。

<hr>

### ``pushd %Develop%``
- 環境変数``%Develop%``で指定されているフォルダに移動する。
  - ``dotnet build``を実行する為に,<br>プロジェクトファイル(``SuperNewRoles.csproj``)が存在するフォルダにコマンドプロンプト上で移動する必要がある。
  - 以降のコマンドはカレントディレクトリが何処であっても,  又ドライブを跨いでいても実行できる為, ``pushd``コマンドの使用は一回のみ。<br><br>
- **ドライブを跨ぐ移動が必要である為``cd``コマンドでは動作しない。** 
  - エラー再現画像
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119123/dd34ef01-d6c4-3648-b733-65c131b456fc.png)<br><br>
  - 移動に関わるファイルと, ファイルが存在する場所
    - バッチファイル : Cドライブ
    - プロジェクトファイル : Eドライブ<br><br>
- ``cd``が使用できない為, その**代わりに``pushd``を使用した。**
  - ディレクトリのストックとしての用途では使用していない。

<hr>

### ``copy /y "%AmongUs%\BepInEx\plugins\SuperNewRoles.dll" "%AmongUsTest%\BepInEx\plugins"``
#### ``copy /y "A_Folder\A'.dll" "B_Folder"``
- ``A_Folder``に存在する``A.dll``というファイルを``"B_Folder"``にコピーする。
- ``copy /y "[コピーしたいファイルのパス]" "[コピー先のフォルダのパス]"`` <br>という構造になっている。
#### オプション : ``/y``
- コピー先に, コピーしたファイルと同名のファイルが既にある場合,「上書き保存をするか」の**ウィザードを表示せずに, 上書き保存を行う**オプション
  - コピー先には必ずコピーしたファイルと同名のファイルがあり, 更にファイルを書き換える事を目的にしている為, このオプションを使用している。

<hr>

### ``exit``
- コマンドプロンプトを終了する。<br><br>
- このコードを使用しない場合, ビルド成功時(``GOTO``で``:Success``に飛ばされた場合)も, ビルド失敗時のコード(``:Miss``)を読む。
  - ``GOTO``は該当するラベルに飛ばすだけの為, 飛んだ先のコードはラベルの存在によらず全て読まれる。<br><br>
  - 終了を明示する必要がある。
    - 例
      1. ``GOTO``でファイルの最後に移動する。
      2. ``exit``でコマンドプロンプトする事で, バッチファイルの実行を停止する。<br><br>
    - ``例2.`` の方法を使用した理由 :
      - ビルド成功時と失敗時で最終の処理が異なる為。
        - 成功時はコンパイルのログを見ない為, コマンドプロンプトを閉じる。
        - 失敗時はコンパイルエラーを確認する為,  コマンドプロンプトを閉じない。

# 参考
- ドライブを跨ぐフォルダ移動
  - [【Windows】コマンドプロンプト上で別ドライブに移動する方法](https://camedphone.com/archives/1190)
  - [JavaDrive_カレントディレクトリをスタックに記憶してから別のディレクトリへ変更(PUSHD, POPD)](https://www.javadrive.jp/command/dir/index5.html)<br><br>
- ファイルのコピー
  - [JavaDrive_ファイルのコピー(COPY)](https://www.javadrive.jp/command/file/index5.html)
  - [WindowsLearn_WindowsServer_copy](https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/copy)<br><br>
- パスの指定方法 (環境変数でパスを指定する際ダブルクォーテーションが必要かの確認。)
  - [パス名を環境変数で指定したCOPYでエラーが発生してしまう](http://fpcu.on.coocan.jp/dosvcmd/bbs/log/cat3/set_path/4-0047.html)<br><br>
- バッチファイルの実行を終了する
  - [JavaDrive_コマンドプロンプトまたはバッチファイルを終了(EXIT)](https://www.javadrive.jp/command/command/index5.html)