choiceコマンド

シェルスクリプトやバッチファイルを実行していると、ユーザに対して「なんとかなんとか Y/N?」といった表示とともに入力が求められることがある。シェルスクリプトやバッチファイルでよく使われる手法のひとつだ。

Windowsにはこれを専門に行うコマンドとしてchoiceというコマンドが用意されている。choiceコマンドの主な使い方は次のとおり。何もパラメータを指定しなければYまたはNのみがユーザによる答えとして受付られるようになる。

choiceコマンドの基本的な使い方

choice パラメータ

choiceコマンドはパラメータで挙動を変更することができる。choiceコマンドで利用できる主なパラメータは次のとおり。

パラメータ 内容
/c 対象 受付対象となる文字リストを指定。a-zA-Z0-9およびアスキー文字で128〜254までを指定可能。デフォルトはYNとなっており、プロンプトとしては[Y,N]?が表示される
/n 受付対象文字一覧を表示しない。表示されないだけで受付対象となるのはYNまたは指定された文字だけであり、また、/mが指定されている場合にはそのメッセージは表示される
/cs choiceコマンドは大文字と小文字を区別しない。/csを指定すると大文字と小文字を区別するようになる
/t 秒 /dで指定された選択を指定した秒数が経過したあとに選択する。指定できる秒数は0から9999までで、0が指定された場合には停止することなく即座に動作する。/tでタイムアウトを指定する場合には必ず/dでどの値を選択するのかを指定する必要がある
/d 文字 /tで指定した秒数後にタイムアウトした場合に選択する文字を設定。/tを指定する場合には必ず/dを指定する必要がある。/dで指定する文字は/cで指定する対象に含まれている必要がある
/m メッセージ 受付対象を表示するまえに表示するメッセージを指定。デフォルトは空になっており何も表示されず、受付文字一覧だけが表示される

choiceコマンドは簡単なコマンドで使いやすいコマンドだ。シェルスクリプトであればread組み込みコマンドに-pを指定した場合の動作と似ている。便利なコマンドなのでどのように動作するのか把握しておこう。

choiceコマンド実行例

choiceコマンドの基本的な実行例は次のようにchoiceコマンドに何もパラメータを指定しないで実行することだ。このようにchoiceコマンドを実行すると、choiceコマンドは入力としてYまたはNだけを取るようになる。YまたはNを入力するとchoiceコマンドは終了する。YとN以外の値を入力してもビープ音が鳴り、処理は継続してコマンドは終了しない。

choiceコマンドの基本的な使い方

choice

choiceコマンドの実行例

choiceコマンドは/cパラメータを使うと受付文字を変更することができる。たとえば次のように/c hiwとパラメータを指定すると、ユーザからの入力はHまたはIまたはWのどれかになる。choiceコマンドによって表示されるプロンプトも[H,I,W]?のように[Y,N]?から変わるようになる。

受付文字を指定して実行

choice /c hiw

受付文字を変更した場合のchoiceコマンドの実行例

choiceコマンドは/mパラメータを使用することでプロンプトにメッセージを追加することができる。次のように実行すればメッセージも同時に表示されるようになる。

メッセージを追加して実行

choice /c hiw /m "はい、いいえ、わからない?"

/cパラメータでメッセージを指定した場合のchoiceコマンドの実行例

choiceコマンドは/nパラメータを指定するとプロンプトを表示しなくなる。ただし、/mパラメータを指定してある場合にはそのメッセージは表示される。つまり、/nと/mパラメータを同時に指定すると、choiceコマンドの出力するデフォルトのプロンプトは表示されなくなり、指定したメッセージだけがプロンプトとして使われるようになる。よりカスタマイズした出力を行いたい場合にはこの組み合わせを利用する。

メッセージのみを出力して実行

choice /c hiw /n /m "はい[H]、いいえ[I]、わからない[W]?"

/nと/mパラメータを同時に使った場合のchoiceコマンドの実行例

choiceコマンドにはタイムアウトを指定する/tパラメータが用意されている。このパラメータを指定すると一定時間が経過した後は自動的に処理を進めることができるようになる。ただし、/tパラメータを使うには同時に/dパラメータも使用する必要がある。/dパラメータでタイムアウトした場合に利用するデフォルト値を設定するためだ。同時に指定しないと利用できない。/dパラメータで指定できる内容は/cで指定した文字リストの中の文字か、/cを指定していない場合にはYかNのどちらかとなる。

タイムアウトとデフォルト値を指定して実行

choice /c hiw /t 30 /d w

タイムアウトを指定してchoiceコマンドを実行

指定した時間が過ぎると自動的にchoiceコマンドが終了

choiceコマンドが提供している機能はBourne Shell系が提供しているread組み込みコマンドの機能と似ている。どちらも便利な機能なので覚えておきたいところだ。

choiceコマンドで選択されたものは?

choiceコマンドで選択された対象は%errorlevel%に保持される仕組みになっている。たとえばchoice /c hiwで実行した場合、hが入力されたら1、iが入力されたら2、wが入力されたら3が入る仕組みになっている。/c hiwで指定した順番がそのまま値として代入される仕組みだ。

choiceコマンドで入力された内容を知る

なお、choiceコマンドをCtrl-Cで終了した場合には0が代入される。

順序がそのまま値として使われているので、バッチファイルの書き換えには注意が必要だ。/cパラメータで指定する内容を変更したり、同じ内容であっても順序を変更した場合には、%errorlevel%を使っている処理の方も書き換える必要がある。それを忘れていると処理がちぐはぐなことになってしまうので要注意だ。

参考資料