「ファイル内のapkファイルを（順番を制御して）インストールするバッチを作成するバッチ」を作成する 

## はじめに
こんにちは。
AndroidOSの組み込み機器向けのアプリ開発を1年ほどやっています。

業務上、複数のapkファイルを一斉にインストールさせるバッチファイル(この記事内では_install.batと呼ぶ)を作成する機会が多く、そのたびに手動で作成するのが手間でした。
今回_install.batを自動で作成してくれるバッチファイルを作成することにしたので備忘録として方法を記します。

なお、筆者はバッチファイルについての知識は素人に毛が生えたレベルでしかないので間違いやおかしなところなどあればご指摘いただければ幸いです。

## 目次
[順番を制御しない場合](#順番を制御しない場合)
[順番を制御したい場合](#順番を制御したい場合)
[おわりに](#おわりに)

## 順番を制御しない場合
```bat:_makeInstallBat.bat
@echo off
:: 作成/上書きするバッチファイル
set BAT=_install.bat

:: _install.batを新規作成し、先頭にpauseを書き込み;
echo pause> %BAT%

:: apkファイルの数だけ、「adb install -r xxx.apk」を書き込む;
for %%A in (*.apk) do (
	echo adb install -r %%A>> %BAT%
)

:: 末尾にpauseとadb rebootを書き込み;
echo pause>> %BAT%
echo adb reboot>> %BAT%
```
フォルダ内のファイル構成が以下のような場合
```
.
├── _makeInstallBat.bat
├── aaa.apk
├── bbb.apk
├── ccc.apk
├── ddd.apk
├── README.md
└── setting.txt
```
_install.batが以下の内容で新規作成（若しくは上書き）されます。
```bat:
pause
adb install -r aaa.apk
adb install -r bbb.apk
adb install -r ccc.apk
pause
adb reboot
```
今回は「xxx.apk」という名前のフォルダがあった場合は考慮しません。（そもそもそんなフォルダを作るな＆インストールしようとしても失敗するだけの話なので）
なお、`echo <書き込みたいコマンド> > _install.bat`としているところを、コマンド部分だけで記述してあげれば、_install.bat介さずにそのままインストールしてくれるバッチファイルになります。

## 順番を制御したい場合
```bat:_makeInstallBat.bat
@echo off
set BAT=_install.bat

:: インストール順を指定したいアプリのプロジェクト名を定義;
set FIRST=firstapp
set SECOND=secondapp
set LAST=lastapp
set BOOBIE=boobieapp

:: _install.batを新規作成or上書きし、先頭にpauseを書き込む;
echo pause> %BAT%

:: 最初＆2番目にインストールしたいアプリのファイル名を変数に保存;
::  & インストール処理を_install.batに書き込む;
for %%A in (%FIRST%*.apk) do set FIRST_FILE=%%A
echo adb install -r %FIRST_FILE%>> %BAT%
for %%A in (%SECOND%*.apk) do set SECOND_FILE=%%A
echo adb install -r %SECOND_FILE%>> %BAT%

:: 最後＆最後から2番目にインストールしたいアプリのファイル名を変数に保存;
for %%A in (%LAST%*.apk) do set LAST_FILE=%%A
for %%A in (%BOOBIE%*.apk) do set BOOBIE_FILE=%%A

:: 変数に保存したファイル以外のapkファイルのインストール処理を_install.batに書き込む;
for %%A in (*.apk) do (
	if not %%A == %FIRST_FILE% ( 
	if not %%A == %SECOND_FILE% (
	if not %%A == %LAST_FILE% ( 
	if not %%A == %BOOBIE_FILE% (
		echo adb install -r %%A>> %BAT%
	))))
)

:: 最後から2番目＆最後にインストールしたいアプリのインストール処理を_install.batに書き込む
echo adb install -r %BOOBIE_FILE%>> %BAT%
echo adb install -r %LAST_FILE%>> %BAT%

:: 末尾にpauseとadb rebootを書き込む;
echo pause>> %BAT%
echo adb reboot>> %BAT%
```

メインの話です。
場合によっては、一斉インストールする際にインストール順を制御したい場合があるかもしれません。
例えば以下のファイル構成だとします。
```
.
├── _makeInstallBat.bat
├── boobieapp-debug-2.2.0.apk
├── firstapp-relase-1.2.0.apk
├── lastapp-staging-1.5.2.apk
├── mobapp2-debug-2.5.0.apk
├── mobapp-release-4.9.2.apk
└── secondapp-debug-1.0.0.apk
```
`firstapp`というプロジェクトは一番最初に、
`secondapp`というプロジェクトは2番目に、
`boobieapp`というプロジェクトは最後から2番目に、
`lastapp`というプロジェクトは最後に、
その他のアプリは順不同でインスト―ルしたいとします。

そのような場合に上のバッチを実行すると_install.batは以下のように書き込まれます。
```:
pause
adb install -r firstapp-relase-1.2.0.apk
adb install -r secondapp-debug-1.0.0.apk
adb install -r mobapp-release-4.9.2.apk
adb install -r mobapp2-debug-2.5.0.apk
adb install -r boobieapp-debug-2.2.0.apk
adb install -r lastapp-staging-1.5.2.apk
pause
adb reboot
```
指定した順番通りになっていると思います。
インストール順の制御を増やしたい場合はその分だけ処理を増やしてあげればOKです。

## おわりに
バッチファイルだと文字列の扱いが難しかったり、配列がなかったりで、こんな簡単な処理でも思ったよりハマってしまいました。
より複雑なことをしたいのであれば、バッチファイルは諦めて慣れているプログラミング言語を用いて書くことを検討したほうがよいと思います。