目次
「Y」か「N」の二択を受け付ける
こちらで指定したキーのみの入力を受け付けるには「choice」コマンドを使用します。
まずは、もっとも簡単な「Y」もしくは「N」の二択をユーザーに選ばせる方法からです。それは、以下のバッチファイル(choice_YN.bat)のようになります。
1 2 3 |
@echo off choice |
これで、ユーザーから「Y」もしくは「N」の入力を待ちます。
以下、実行結果です。
「Y」もしくは「N」を入力すると、プログラムが進みます。「Enter」キーを押す必要はなく、入力と同時にプログラムが動きます。
それ以外のキーを入力すると「ピー」っというビープ音がなり、キーを入力することができません。つまり、「Y」もしくは「N」キーを押さないかぎりプログラムを先へ進ませることができません。
ユーザーがどっちを入力したかは、変数「errorlevel」を参照することで知ることができます。「Y」を入力したなら「errorlevel」には、「1」が、「N」を入力したなら「errorlevel」には2が入っています。
以下にそれを確認するためのバッチファイル(choice_YN_check.bat)を示します。
1 2 3 4 |
@echo off choice echo %errorlevel% |
以下、実行例です。
「Y」を入力したときには「1」、「N」を入力したときは「2」が変数「errorlevel」に格納されていることが分かります。
これを利用して、「Y」を入力したときと「N」を入力したときで、それぞれ違う処理を行うようなバッチファイルを作りましょう。それには、
1 |
if errorlevel [番号] goto [番号に対応するラベル] |
を使用します。
変数「errorlevel」が[番号]で以下であれば、[番号に対応するラベル]に飛ぶコマンドです。「Y」か「N」かで、飛ぶラベルを変えてやり、それぞれの処理を書いていれば、ユーザーの入力によって行う処理を変化させることができます。「errorlevel」についての詳しい解説は「errorlevelの値から分岐処理を行う -やりたいことから検索-」をご覧下さい。
以下に、これを使用したバッチファイル例(choice_errorlevel.bat)を示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@echo off choice if errorlevel 2 goto :no if errorlevel 1 goto :yes :no echo いいえ、違います。 exit /b :yes echo はい、そうです。 exit /b |
3行目の「choice」コマンドで「Y」か「N」の入力を要求します。
4,5行目でその入力に対して、それぞれの処理を書いたブロック(サブルーチン)に飛びます。「Y」入力の場合は「errorlevel」は「1」ですので、「:yes」ラベルに飛びます。「N」の場合も同様です。
ちなみに入力の際、大文字と小文字は区別しませんので、「y」や「n」の入力でも構いません。
「exit /b」はそこでブロック内の処理を終了し、メインプログラムへ戻るコマンドです。ラベルやブロック(サブルーチン)については、「バッチファイルでサブルーチンを使用する -やりたいこと検索-」に詳しく説明していますので参考にして下さい。
以下、実行結果です。
ここで注意すべきことは、「if errorlevel」コマンドは「errorlevel」の値が大きい方から並べるということです。ですので、上記のバッチファイルは、以下のように並べました。
if errorlevel 2 goto :no
if errorlevel 1 goto :yes
これを、
if errorlevel 1 goto :yes
if errorlevel 2 goto :no
のように小さいほうから並べてしまうとうまくいきません。
以下、間違った並びのバッチファイル例(choice_errorlevel_fail.bat)と実行結果ですが、どちらを入力しても「Y」を入力したときの実行結果になってしまっています。
詳しくは「errorlevel(終了コードを取得する) -コマンド別解説-」を参照して下さい。
選択肢を自分で設定する
「Y」と「N」だけではなく他のキー入力を受け付けたいときは、「/c」オプションを使用します。
1 |
choice /c [選択肢] |
[選択肢]には、入力を受け付けるキーを指定します。例えば、「1~3」までの入力を受け付けるときのバッチファイル「choice_c_123.bat」は以下の通りです。
1 2 3 4 |
@echo off choice /c 123 echo %errorlevel% |
以下実行結果です。
「errorlevel」には「1」を選択した場合は「1」が、「2」を選択した場合は「2」が、…というように左から「1」、「2」、…と値が入ります。
「choice /c 098」としたときも、「0」を選んだ場合は「errorlevel」は「1」、「0」を選んだ場合は「2」…です。
キーの選択肢には、文字も指定できます。
1 2 3 4 |
@echo off choice /c ijk echo %errorlevel% |
この場合は、「i」を選択した場合には「errorlevel」には「1」、「j」を選択した場合には「errorlevel」には「2」が、…となります。
入力に応じた処理ブロック(サブルーチン)を書く場合、これらのように選択肢が3つ以上ある場合でも前節と同様です。入力に応じた処理を記述したバッチファイル(if_c_subroutine.bat)を示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
@echo off choice /c OAB if errorlevel 3 goto :B-type if errorlevel 2 goto :A-type if errorlevel 1 goto :O-type :O-type echo O型は社交的です。 exit /b :A-type echo A型は几帳面です。 exit /b :B-type echo B型は自由奔放です。 exit /b |
3行目でキー入力を求め、4~6行目でそれに応じた条件分岐をしていますが、ここでも「if errorlevel」コマンドは値が大きい方から並べることに注意して下さい。
以下、実行結果です。
メッセージを表示する
選択肢の表示と同時に、ユーザーにメッセージを表示させたいときは、「/m」オプションを指定します。
1 |
choice /c [選択肢] /m "[メッセージ]" |
下記の例は、バッチファイル「if_c_subroutine.bat」にメッセージを加えたものです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
@echo off choice /c OAB /m "あなたの血液型を教えて下さい。" if errorlevel 3 goto :B-type if errorlevel 2 goto :A-type if errorlevel 1 goto :O-type :O-type echo O型は社交的です。 exit /b :A-type echo A型は几帳面です。 exit /b :B-type echo B型は自由奔放です。 exit /b |
以下、実行結果です。
選択肢を表示しない
「/n」オプションを指定すると選択肢を表示しません。
バッチファイル「choice_n.bat」、
1 2 3 |
@echo off choice /c OAB /n |
を実行した結果を示します。
このように入力時は何も表示されないので、選択肢が分かりません。
このような場合は、「/m」オプションを使って選択肢が分かるようなメッセージを表示するのがよいでしょう。以下、「/n」オプションと「/m」オプションを併用したバッチファイルの例「choice_n_m.bat」です。
1 2 3 |
@echo off choice /c OAB /n /m "あなたの血液型を入力して下さい。" |
選択に時間制限を与える
選択に時間制限を与えて一定時間入力がなかったら、あるキーを入力したとみなして進めることが可能です。
使用するオプションは「/t」と「/d」であり、これらは組み合わせて使われます。「/t」は制限時間を秒で指定します。制限時間を過ぎれば、「/d」で指定したキーを入力したとしてプログラムが進みます。
1 |
choice /c [選択肢] /t [時間制限(秒)] /d [制限時間を過ぎたら強制的に選択されるキー] |
例えば、ここまで散々使用してきた血液型のバッチファイルですが、以下のように書いたとします(choice_td.bat)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
@echo off choice /c OABx /t 10 /d x /n /m "あなたの血液型を入力して下さい。" if errorlevel 4 goto :unknown if errorlevel 3 goto :B-type if errorlevel 2 goto :A-type if errorlevel 1 goto :O-type :unknown echo あなたは自分の血液型を知らないのですか? exit /b [以下のサブルーチンは省略] |
「x」キーを追加して、そのキーに対する処理を追加しました。(※「O」、「A」、「B」キーに対する処理は省略しています。)
「/t」オプションで10秒を指定し、「/d」オプションで「x」キーを指定していますので、回答の時間制限10秒を過ぎると、「x」キーが押されたとしてプログラムが進みます。すると、「errorlevel」には「4」が入り、サブルーチン「unknow」の処理が実行されることになります。
以下、上記のバッチを実行後、10秒間入力しなかったときの実行結果です。
10秒後、自動的に「X」が入力されてプログラムが先へ進みました。