プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
Windows、バッチファイル(.bat)でラベルに対する「goto」と「call」の違い
結論から書くと

gotoはラベルの場所に移動、callはラベル以降をサブルーチンとして呼び出す

です。

それでは詳細を書いていきます。

まずは論より証拠、以下の2つのバッチファイルをご覧ください。

■test01.bat
@echo off

echo start

goto label_a

echo end

exit /b 1

:label_a
exit /b 2

■test02.bat
@echo off

echo start

call :label_a

echo end

exit /b 1

:label_a
exit /b 2

2つのバッチファイルの違いは

goto label_a



call :label_a

の部分だけです。
「goto」と「call」の違いですね。

バッチファイルを実行すると「test01.bat」の実行結果が

start

になるのに対し「test02.bat」の実行結果は

start
end

になります。
また、ERRORLEVELを確認すると

test01.bat実行後→2
test02.bat実行後→1

になっていました。

もう少し細かく見てみましょう。

gotoの方は、文字通りそこに移動します。
そのため「test01.bat」(goto)で処理が通るのは

1.@echo off
2.echo start
3.goto label_a

※ここでラベルのところに移動

4.:label_a
5.exit /b 2

の5行です。
「5.」で返却される値が「test01.bat」の戻り値(ERRORLEVEL)になります。

一方、callの方は、サブルーチンとしての呼び出しです。
処理が終わったらその場に戻ってきます。
そのため「test02.bat」(call)で処理が通るのは

1.@echo off
2.echo start
3.goto label_a

※ここでラベルのところに移動

4.:label_a
5.exit /b 2

※ここで呼出元(「3.」の次の行)に戻る

6.echo end
7.exit /b 1

の7行です。
「5.」で返却される値は、サブルーチン「:label_a」の戻り値(ERRORLEVEL)、
「7.」で返却される値が「test02.bat」の戻り値(ERRORLEVEL)になります。

さて、ここで一つ疑問が出てきました。

わたし、気になります。

ラベルに引数って渡せるんですかね(--?

早速やってみましょう。
まずは「goto」の方からφ(--)

■test03.bat
@echo off

echo start

goto :label_a "param1"

echo end

exit /b 1

:label_a
echo %1
exit /b 2

結果はこんなんでしたφ(--)

start
ECHO は <OFF> です。

あー、gotoで移動だとやっぱり駄目っぽいですね。

次に「call」の方φ(--)

■test04.bat
@echo off

echo start

call :label_a "param1"

echo end

exit /b 1

:label_a
echo %1
exit /b 2

結果はこんなんφ(--)

start
"param1"
end

おぉ、渡ってる(人´∀`)

どうやら、call呼び出しは、文字通りサブルーチンとして扱えるようです。
ちゃんと引数も渡りました。

なるほどねー。

最後に、もう一度まとめておきます。
ラベルに対する移動は「goto」を使うと、文字通り「移動」です。
ラベル以降の処理をした後に、移動元に戻ってきません。

一方「call」を使った場合は「サブルーチンとしての呼び出し」になります。
「exit /B」が実行された時点で、呼出元に戻ります。

そんな感じ\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:コマンド/バッチ  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事