Programming Field

Goto - DOS コマンド一覧

スポンサーリンク

バッチファイル内で、指定したラベル名の行に処理を移します。

構文

goto <label-name>
<label-name>
処理を移したい行にあるラベルの名前を指定します。ここには「:」は必要ありません。(後述)
[MS-DOS, Windows 95/98/Me] ラベル名は最初の8文字のみが使用されます。最初の8文字が一致する、最初に見つかったラベルの場所にジャンプします。
[Windows NT系][拡張構文] <label-name> に「:EOF」と、コロン文字を含めて「:EOF」を指定すると、ラベルの記述にかかわらずバッチファイルの末尾にジャンプします。すなわち、「goto :EOF」とするとバッチファイルまたはサブルーチン(Callによる呼び出し)の処理を終了させることができます。なおこの記述に限り、コロンを含めないと「EOF」というラベルにジャンプしようとするため、必ずコロンが必要です。
※ MS-DOSやWindows 95/98/Me、および拡張構文が有効になっていない場合は「goto :EOF」を利用することができません。Setlocalで明示的に有効にしない場合は「goto :EOF」が確実に働くとは限りませんので、「goto :EOF」ではなくバッチファイルの末尾に明示的にラベルを記述してジャンプさせるか、「exit /B」で処理を終了させる必要があります。

解説

このコマンドは、バッチファイルで条件分岐を行いたいときに、Ifとともによく用いられるコマンドです。通常バッチファイルは、ファイルの上から順番に1行ずつ実行されますが、Gotoを使うと途中の行を飛ばしたり、前の行に戻ったりすることが出来ます。途中で条件によって処理を分ける必要がある場合は、「処理をしない行」をスキップする必要があるため、Gotoによるジャンプが必要になります。

ラベルを定義するには、以下のように行の先頭に「:」(コロン)を書き、その直後にラベル名だけを記述します(プログラミング言語のよくある記法と異なるので注意してください)。なお、GotoによるジャンプはGotoがある行よりも後に限らず前にもジャンプ可能です。

:MyLabel
echo MyLabel に到達

このラベルの場所にジャンプしたい場合は、以下のように記述します。

goto MyLabel

[Windows NT系][拡張構文] Callコマンドの拡張構文でもラベルにジャンプすることができますが、CallはExitを用いることで(ほぼ)元の場所に戻ることができます。Gotoの場合はGotoを使った次の行に自動で戻る方法はありませんので、戻りたい場合は別途ラベルを記述する必要があります。

サンプル1 (バッチファイル)

@echo off
echo 何か文字列を入力し、終わったら Ctrl+Z を押して Enter を入力してください。
type CON > temp1.dat
find "7" temp1.dat > NUL
if errorlevel 1 goto NotFound
echo 幸運の数字が秘められた文字列でした。
goto OnExit

:NotFound
echo 普通の文字列でした。

:OnExit
del temp1.dat

Findコマンドの終了コードを利用して、入力文字列から「7」を検索するちょっとしたプログラムです。

サンプル2 (バッチファイル)

@echo off
setlocal enableextensions
set COUNT=0

:MainLoop
set /A COUNT="COUNT + 1"
set /A P="COUNT %% 3"
set /A Q="COUNT %% 5"
if %P%%Q%==00 echo FizzBuzz & goto LoopCheck
if %P%==0 echo Fizz & goto LoopCheck
if %Q%==0 echo Buzz & goto LoopCheck
echo %COUNT%
:LoopCheck
if %COUNT% LSS 30 goto MainLoop

[Windows NT系][拡張構文] バッチファイルでいわゆる「Fizz Buzz」の出力を30までの数に対して行ってみた例です。このバッチファイルでは、GotoとIf、およびSetの算術演算構文を用いて有限ループを作り、「MainLoop」ラベルから「LoopCheck」ラベルの次の行までの処理を複数回行えるようにしています。

※ この例ではあくまで「Gotoコマンドの例」としてこのような記述を行っています。数値を用いる有限のループを記述する場合は「for /L」を用いる方が楽である場合があります。「Fizz Buzz」のプログラムとしても最適な手段として記述しているわけではありませんのでご注意ください。
※ 7~8行目の「P」および「Q」に値をセットする文では、剰余を計算する「%」文字をバッチファイル内で使うために「%%」と記述しています。バッチファイル内の「%」の利用については「%」のページも合わせてご覧ください。