Tips : バッチと連携してみよう
2017/06/02

CatShanty2の同時起動アプリでバッチと連携してみよう


BIOSは吸い出せてもDOSはイマイチわからない?
中身がわかれば応用が効く。基本のキの字をおさらいしてみましょう。

バッチって?

コマンドプロンプトで一連の作業を実行させるためのテキストファイルです。
メモ帳などでテキストファイルを編集して、拡張子を.batにすればバッチファイルとして実行できます。
バッチファイル

コマンドプロンプトって?

Windows10 ならスタートを右クリックすると「コマンドプロンプト」という項目が見つかると思います。
「コマンドプロンプト」をクリックすると俗に云う「DOS窓」「黒い画面」が開きます。
コマンドプロンプト

PowerShell になっている人は、タスクバーの設定>"コマンドプロンプトをWindows PowerShellに置き換える" をOFFにするか、ファイル名を指定して実行>cmd[ENTER]で出てきますよ。

コマンドプロンプトはCUI(キャラクタベースユーザーインターフェースなどの略)と呼ばれる、命令(コマンド)を文字で入力してプログラム等を実行するコンソール画面です。

この命令をあらかじめバッチファイルに記述しておくことで、いちいちDOS窓を開いて一つ一つコマンドを手入力しなくても一連の実行を行うことができるのです。

CatShatny2 の同時起動アプリ?

CatShanty2 では、エミュレータの起動及びエミュレータからの復帰時のタイミングで、他のプログラムを起動することができます。

単に他のプログラムを起動するだけでなく、CatShanty2独自の置換定数という仕組みを利用すれば、プログラムに対して状況に応じた引数(パラメータ)を渡すことも可能です。

つまり起動されるプログラムが引数に対応していれば、その都度プログラムの動き方を指定することができるわけです。

バッチもアプリのひとつ

バッチは実行ファイルの一種なので、CatShanty2の同時起動アプリとして起動できます。 またバッチの中で条件分岐やループも可能なため、上手く使えば1バッチファイルで色々な動作を実行させられます。

CatShanty2の同時起動アプリは2個まで登録できますが、バッチを上手く使うことでそれ以上のアプリを連携して色々な処理を実行することができるわけです。

Alcohol 52% 用マウントバッチを解説

それでは、こちらの CDイメージマウントバッチを例に、実際のバッチで何が行われているか見てみましょう。

このバッチの使い方は

a52mt.bat マウント先ドライブ名 マウントするCDイメージパス

となっていて、ドライブ名とイメージパスの2つの引数を受け取れるようになっています。

@echo off
rem --------------------------------------------------------------

rem アルコール52%でCDイメージをマウントするバッチです
rem a52mt drive path

rem ちなみにアルコール52%のコマンド
rem AxCmd.exe [drive:] [/M:path] [/U] [/L] [/?] [@cmd]

rem --------------------------------------------------------------

set ORG_FN=%~2

rem 引数1(ドライブ)が無ければ終了へ
if "%1" == "" goto quit

rem Alcohl52%のインストールディレクトリにパスを通す
path %PATH%;C:\Program Files (x86)\Alcohol Soft\Alcohol 52\

rem 仮想F:ドライブをアンマウント
echo 仮想ドライブ %1 をアンマウントしています
AxCmd.exe %1 /U

rem 引数2(ファイルパス)が無ければ終了へ
if "%ORG_FN%" == "" goto quit

rem 仮想F:ドライブに、引数(%1)のイメージをマウント
echo %2 をマウントします
Axcmd.exe %1 /M:"%ORG_FN%"

set ORG_FN=

:quit

1~10行目

@echo off
rem --------------------------------------------------------------
:
:

@echo off とは、この後に実行される命令をコマンドプロンプト画面に表示しないという命令です。@を付けてecho off自体も表示されないようにしています。
rem行は注釈となり、この行に書いた内容は動作に影響を与えません。

バッチ動作を確かめたい時は、@echo offの行を除去するか、rem @echo offとして実行結果が見えるようにすると良いでしょう。

12行目

set ORG_FN=%~2

setは変数に値を定義します。この場合ORG_FNという変数に%~2を入れています。

この、%ホニャララはバッチファイルに与えられた引数(パラメータ)です。
%~2の場合は2番めの引数からダブルクオーテーションを除去したものを意味します。

15行目

if "%1" == "" goto quit

ifは条件分岐で次の式が成立するとき、その後の命令を実行します。
gotoは指定したラベル行へジャンプする命令です。

つまりこの場合

1番めの引数が空っぽなら、ラベル quit の行へジャンプする

という意味になります。

ジャンプ先であるラベル行は先頭に:を付けて:quitのように書きます。

18行目

path %PATH%;C:\Program Files (x86)\Alcohol Soft\Alcohol 52\

path命令は、コマンドプロンプトからプログラムを起動させようとしたとき、コンピューターがそのプログラムを探す場所を指定します。 「パスを通す」などと言います。パスの通っていない場所にあるプログラムはコマンドプロンプトからプログラム名だけで起動することはできません。

また%PATH%は、既に定義されているパスの内容を意味しますので、つまりこの場合

既に通っているパスに、Alcohl52%のインストールディレクトリを追加する

という意味になります。

Alcohl52%のインストールディレクトリがこの例題バッチの内容と異なる場合は、ここを書き換えましょう。

21~22行目

echo 仮想ドライブ %1 をアンマウントしています
AxCmd.exe %1 /U

echoの後の文字列はそのまま画面に表示されます。%1は1番目の引数でしたので、その部分は与えられたドライブ名が表示されます。

AxCmd.exeはAlcohl52%のインストールディレクトリに存在するコマンドプロンプト用のプログラムです。
続く%1/UAxCmd.exeへ渡す引数(パラメータ)です。

つまり

仮想ドライブのマウント先ドライブ名(%1)と アンマウント(取り外し)(/U)を指定して AxCmd.exe を実行する

となります。

ちなみにAxCmd.exeは18行目で上手くパスが通っていれば実行されますし、パスが通っていなければ次のようなエラーが出て失敗するでしょう。

'AxCmd.exe' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

バッチの実行内容を確認するときは1行目の@echo offを外す事を思い出してください。

25行目

if "%ORG_FN%" == "" goto quit

15行目と同じく条件分岐です。
ここではORG_FN、つまり2番めの引数が空っぽなら、quitへジャンプします。
定義した変数を使う時は%で囲んで%ORG_FN%と記述します。

これにより

2番めの引数が指定されなかった場合は、アンマウントのみ行う

という動作を可能にしています。

29行目

Axcmd.exe %1 /M:"%ORG_FN%"

これも22行目と同じで、またAxcmd.exeを実行しています。
今度は/Mを付けているのでマウント先を指示することになります。

%1であるドライブ名と、%ORG_FN%のイメージパスを指定しています。

ダブルクオーテーションを除去したので、"%ORG_FN%"とダブルクオーテーションで囲んであります。

ダブルクオーテーションを除去した理由は次の通りです。(難しければこの説明はスルーして構いません)

  • ユーザーがダブルクオーテーションを付けた場合、付けなかった場合、両方に対応するため
  • 25行目で""を比較するため

31行目

set ORG_FN=

定義した変数ORG_FNにサヨナラしています。
変数名の=後に何も付けないと、変数を開放する意味になります。

33行目

ラベル行です。
この後に何もないので、途中からgotoでジャンプしてきた場合もここで終了となります。

CatShanty2からバッチを起動する

さてバッチの準備ができたら、CatShatny2から呼び出してみましょう。

具体的なエミュレータの設定方法例は他のページに用意してありますので、そちらも参照してください。

メニュー→エミュレータ→エミュレータ設定をクリックします。
エミュレータ設定の一覧から、連携させたいエミュレータ設定のダイアログを開きます。

「補助設定2」タブを開いて各項目を以下のように指定します。 エミュレータ設定:補助設定2

起動時に実行する他のアプリケーション

プログラム1

C:\batch\a52mt.bat

作成したa52mt.batを指定します。

C:\batchの部分は自分で保存したa52mt.batの場所に書き換えてください。

オプション1

P: $image

引数を指定します。
P:ドライブに$imageをマウントします。

P:は自分のAlcohl52%で用意した仮想ドライブに書き換えてください。

$imageはCatShatny2の置換定数のひとつです。
CatShanty2が起動しようとしているイメージパスに置き換えられますので、バッチファイルにはCDイメージ等のパスが渡ることになります。

プログラム1の終了を待機

チェックをONにして、バッチ処理が終わるまでエミュレータが起動しないようにします。

正常終了以外はエミュレータの起動を中止

チェックをONにすれば、万が一バッチが失敗した時にエミュレータが起動しないようにできます。

終了時に実行するアプリケーション

プログラム1

C:\batch\a52mt.bat

ここも同じバッチファイルを指定します。

オプション1

P:

今度はドライブ名のみ指定することで、アンマウントのみ行うように指示しています。

復帰遅延(秒)

2秒程度を指定するとアンマウント処理とCatShanty2の復帰処理が重なってワタワタせずスッキリした連携に見えます。

まとめ

以上でバッチファイルの仕組みからCatShanty2との連携まで詳しく解説しました。

バッチは(作者も知識に乏しいうえ)奥が深いですし、CatShanty2の置換定数も色々と用意してあります。
「こんな時、こんな風にエミュレータを起動できたら良いのにな」と思ったらバッチ連携を試してみてください。