batファイルで好きな位置まで移動できると色々と便利です。
そんな事出来ないと思っていませんか?
「goto」コマンドを使用すれば以外と簡単に可能だったので、ここに覚書します。

「goto」を覚えたら、batファイルを綺麗に書いたりインタラクティブなbatファイルにしたり出来ます。



つまり一段階上のスキルになります。絶対に覚えて下さい。
windowsのプロンプトで使用できるbatやpythonやphpを使用して、業務効率化やWebサイトを作成しております。javaやシェルスクリプトなど、様々なプログラミングを行った実績ありの筆者です。
batファイルでのgotoコマンドの使い方


batファイルで「goto」コマンドの基礎構文は以下のコードです。
@echo off
REM gotoコマンドでラベルを指定します
goto :ラベル1
飛ばしたい処理
REM ラベルを作成します
:ラベル1
ここに飛びます。
pause
「@echo off」を使用するとbatファイルに記述したコマンドを表示しなくなり、結果が見えやすくなります。「@echo off」に関しては下の記事をご覧ください。


REMを使用するとbatでコメントアウトする事が出来ます。batのコメントアウトに関しては下の記事をご覧ください!


その他のコメントアウト方法や「:」もコメントアウト方法ですが、ここでの「:」はコメントアウトにならない理由などは以下の記事をご覧ください!


gotoコマンドの後に「:」をおいて自分の好きなラベルを指定します。
「:」の後にラベルを指定すれば、そこまで処理を飛ばす事が可能です。
goto以外でもラベルに飛ぶコマンドで「call」がありますが、今回はgotoの方が使いやすいです。callコマンドについては以下の記事にまとめています。


最後の「pause」は実行したバッチの処理を確認する為に一時停止しています。


batのgotoコマンドで最終行まで移動する方法


batファイルのgotoコマンドでもうひとつ便利な使い方をご紹介します。
ラベルを使用して最後の行まで移動する方法です。
つまりスクリプトを終える事が可能です。
@echo off
REM batの最終行まで飛びます
goto :EOF
飛ばす処理
このようにgotoコマンドでEOFラベルを指定します。
EOFというのはbatファイルの最後の行にある暗黙のラベルです。
これでファイルの最終行まで飛ぶ(スクリプトを終わらせる)事が可能です。
実践:batファイルでgotoコマンドを使用してみた
では実際にbatファイルを作成して、gotoコマンドを使用して見ます。
@echo off
echo この行が最初の行です!
REM lastのラベルまで飛びます
goto :last
REM ここの行が表示されなければ成功です
:NUL
echo この行は不要です。
REM 最後に表示する文字
:last
echo この行が最後の行です!
REM batの最終行まで飛びます
goto EOF
REM ここの行が表示されなければ成功です
:NUL
echo この行もまた不要です。
gotoコマンドを使用したコード説明
まず「この行が最初の行です!」と表示をします。
gotoコマンドで「last」ラベルまで飛びます。
「この行は不要です」が飛ばされて表示されないはずです。
「last」ラベルを作成して「この行が最後の行です」と表示させます。
gotoコマンドで最後の行にある暗黙のEOFラベルを指定します。
最後の行に飛ぶはずなので「この行もまた不要です」が表示されないはずです。
ではbatを実行してみます。


gotoコマンドでエラーが出たので対処してみた
下のように「指定されたバッチ ラベルが見つかりません -EOF」というエラーが出ました。


コードをよく見るとEOFの前に「:」がないですね。
これがないとラベルと見てくれないのでしっかり「:」をつけましょう。
という事で修正したコードをもう一度実行します。
@echo off
REM startのラベルを張ります
:start
echo この行が最初の行です!
REM lastのラベルまで飛びます
goto :last
REM ここの行が表示されなければ成功です
:NUL
echo この行は不要です。
REM 最後に表示する文字
:last
echo この行が最後の行です!
REM batの最終行まで飛びます
goto :EOF
REM ここの行が表示されなければ成功です
:NUL
echo この行もまた不要です。
batファイルの実行結果は


先程のエラーがなくなり想定通りの結果となりました。
応用編:業務でも使えるgotoコマンドを使用したbatファイル
ここでは「goto」コマンドを使用した応用編をお伝えします。
条件分岐が出来る「if」と組み合わせると実務でも使用できるbatファイルが出来ます。
@echo off
:again
set /p suji="数字を入力してください:"
if defined suji (
echo あなたが選んだ数字は%suji%です
) else (
goto :again
)
pause
①ラベルを一番前に持ってきています。今回は「again」というラベルを最初に指定しています。
②次に「set /p」コマンドでユーザーに値を入力してもらいます。


③「set /p」コマンドでユーザーに入力してもらった文字列を指定した変数に格納します。
「set /p」コマンドのようにsetを使用して、インタラクティブなバッチファイルを作成したい場合は、下の記事を参考にしてください。


④「if」文で変数に値がはいっているか確認して、入っていればメッセージを表示、いなければ一番前に戻るbatファイルです。


この処理を追加するだけで、ユーザーが入力しなかった場合に何回も入力を促す事が可能です。
まとめ:batのgotoコマンドで指定したラベルまで移動する方法


batファイルでgotoコマンドの使い方の基礎は以下のコードです。
@echo off
REM gotoコマンドでラベルを指定します
goto :ラベル1
飛ばしたい処理
REM ラベルを作成します
:ラベル1
ここに飛びます。
gotoコマンドの後にラベルを指定する。
ラベルを作成してここまで飛ばせる
またbatファイルの最後まで飛ばすには以下のコードを使用すれば簡単です。
@echo off
REM batの最終行まで飛びます
goto :EOF
飛ばす処理
ラベルに暗黙のEOFを指定すれば、コードの最後まで飛べる。
batファイルでgotoコマンドを使えば好きな箇所に飛べるので便利です。