Programming Field

Choice - DOS/コマンドプロンプト コマンド一覧

2つ、あるいは複数の選択肢を表示します。選択肢を選ぶには、対応したキーを押します。

[Windows NT 系/XP] このコマンドは存在しません。ただし、ツールキットをインストールして入手したり、古いMS-DOSから持ち込んで実行することは可能です。

[Windows Vista 以降] 「choice.exe」プログラムが存在し、同じような機能を提供しますが、若干構文が異なります。(以下の「構文」をご覧ください。)

構文

MS-DOS, Windows 95/98/Me 版

choice[.com] [/C[:]<choices>] [/N] [/S] [/T[:]c,nn] [<message>]

オプション一覧

/C[:]<choices>

選択肢となる文字を指定します (「:」はあっても無くても構いません)。たとえば、「Y」と「N」を選択させたい場合は「/C:YN」、「Y」と「N」と「C」を選択させたい場合は「/C:YNC」と指定します。

省略した場合、「/C:YN」となります。

/N 選択肢と「?」を表示させません。指定しなかった場合、<message> に続けて「[Y,N]?」(/C:YN の場合) のように選択肢が表示されます。
/S 選択肢の大文字・小文字を区別します。
/T[:]c,nn 選択する時間を設定します。cは時間切れのときの選択肢、nnは制限時間を秒数で指定します。この秒数は1桁か2桁で指定してください。なお、時間切れのときに何の選択肢が自動的に選ばれたかは表示されます。
<message> 「[Y,N]?」(/C:YN の場合) の前にメッセージを表示させます。指定しない場合、何もメッセージは表示されません。

Windows Vista 以降版

choice[.exe] [/C <choices>] [/N] [/CS] [/T nnnn /D c] [/M <message>]

オプション一覧

/C <choices>

選択肢となる文字を指定します (/C と選択肢の間にスペースを置く必要があります)。たとえば、「Y」と「N」を選択させたい場合は「/C YN」、「Y」と「N」と「C」を選択させたい場合は「/C YNC」と指定します。

省略した場合、「/C:YN」となります。

/N 選択肢と「?」を表示させません。指定しなかった場合、<message> に続けて「[Y,N]?」(/C YN の場合) のように選択肢が表示されます。
/CS 選択肢の大文字・小文字を区別します。
/T nnnn

選択する時間を設定します。nnnnは制限時間を秒数で指定します。この秒数は4桁までの数値で指定してください。

時間切れの際に選択される選択肢を指定する場合は「/D」を使います。/D は必ず指定する必要があります。

/D c /T で指定した時間が経過したときに選択される選択肢を指定します。必ず /T とセットで使う必要があります。
/M <message> 「[Y,N]?」(/C YN の場合) の前にメッセージを表示させます。指定しない場合、何もメッセージは表示されません。なお、メッセージにスペースを含む場合は「"」で囲む必要があります。

解説

Choice使用例(Vista以降)

Choiceは画面上に選択肢を表示して入力待ちを行うプログラムです。それ以上の機能は提供しませんが、選択された文字に応じて終了コードが変わるため、バッチファイルで分岐処理を行う際に便利です。

選択肢にないキーが押されるとビープ音が鳴ります(コンソールにBEL(07h)の文字が出力されます)。

終了コード

このコマンドは、選択肢が選択されると終了コード(エラーコード)を返します。1番目の選択肢を選ぶと1、2番目の選択肢を選ぶと2、n番目の選択肢を選ぶとnが終了コードとなります。また、入力待ちでCtrl+BreakやCtrl+Cが押されると0、エラー時は255となります。終了コードで処理を分けるときはIf Errorlevel構文を使用しますが、If Errorlevelは「n以上の場合」に分岐するため、

choice /C:YN 続行しますか
if errorlevel 255 goto OnExit
if errorlevel 2 goto OnExit
if errorlevel 1 goto Next
goto OnExit

のように降順で並べる必要があります。(%ERRORLEVEL% を用いる場合はこの限りではありません。)

サンプル1 (バッチファイル) [MS-DOS, Windows 95/98/Me]

@echo off
rem バッチファイルでの例
choice /C:YN 続行しますか
if errorlevel 2 goto OnExit
rem 終了コード 3 を処理する場合、上の行より前におきます。
if errorlevel 1 call work.bat

rem N を選択するとここに飛びます。
:OnExit

Choiceで選択肢を表示し、Yが選択された場合に「work.bat」を実行し、Nが選択された場合に終了します。メッセージパラメーターを使って選択肢の前に「続行しますか」のメッセージを表示します。

サンプル2 (バッチファイル) [Windows Vista 以降]

@echo off
rem バッチファイルでの例
choice /C YN /M "続行しますか"
if errorlevel 2 goto OnExit
rem 終了コード 3 を処理する場合、上の行より前におきます。
if errorlevel 1 call work.bat

rem N を選択するとここに飛びます。
:OnExit

Choiceで選択肢を表示し、Yが選択された場合に「work.bat」を実行し、Nが選択された場合に終了します。/M オプションを使って選択肢の前に「続行しますか」のメッセージを表示します。

サンプル3 (バッチファイル) [MS-DOS, Windows 95/98/Me]

@echo off
:OnRetry
foo.exe
if not errorlevel 1 goto OnExit
echo エラーが発生しました。もう一度処理を行う場合は30秒以内に「R」を押してください。
echo 処理をすぐにキャンセルする場合は「C」を押してください。
choice /C:RC /T:C,30 /N
if errorlevel 2 goto OnExit
if errorlevel 1 goto OnRetry

:OnExit

「foo.exe」が0より大きい終了コードを返した場合にリトライするかどうかの選択を求めます。ただし30秒のタイムアウトによって入力待ちのまま止まらないようにしています。

サンプル4 (バッチファイル) [Windows Vista 以降] [拡張構文]

@echo off
:OnRetry
foo.exe
if "%errorlevel%"=="0" goto OnExit
echo エラーが発生しました。もう一度処理を行う場合は30秒以内に「R」を押してください。
echo 処理をすぐにキャンセルする場合は「C」を押してください。
choice /C RC /T 30 /D C /N
if "%errorlevel%"=="1" goto OnRetry

:OnExit

「foo.exe」が0以外の終了コードを返した場合にリトライするかどうかの選択を求めます。ただし30秒のタイムアウトによって入力待ちのまま止まらないようにしています。

なお、タイムアウトしたいだけの場合はTimeoutコマンドを使うこともできます。

Errorlevelを環境変数として用いるには拡張構文が有効になっている必要があります(通常は有効です)。また、「ERRORLEVEL」という環境変数が定義されているとうまく動きません(「%」のページもご覧ください)。

関連項目