目次
バッチファイルの変数はすべてグローバル変数のようなもの
通常、バッチファイルで使用する変数はどこからでも同じ場所を参照する「グローバル変数」(のようなもの)です。本当は違うんですが、詳しい人は怒らないで下さい。
以下にサブルーチンを使った変数の有効範囲を確認した例を示します。以下のバッチファイル例(global_hensu.bat)を見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
@echo off rem 1回目の変数の設定 set hensu=yahoo echo メインプログラムの初め=%hensu% echo; rem サブルーチンの呼び出し call :subroutine echo メインプログラムの最後=%hensu% goto :eof :subroutine rem 2回目の変数の設定 set hensu=google echo サブルーチンの中=%hensu% echo; exit /b |
まずは実行結果を見てみましょう(下図)。
はじめに、変数には「yahoo」が格納されており、サブルーチン内では「google」、最後も「google」となっています。
では、プログラムに戻って説明します。4行目で変数「hensu」に文字列「yahoo」を代入しています。当然、5行目の変数の中身の確認では、文字列「yahoo」が代入されています。
その後、9行目でサブルーチン内に入り、18行目で変数「hensu」には文字列「google」が代入されるため19行目の出力では「google」となります。そして、メインプログラムに戻ります。
戻った後の変数「hensu」を11行目で確認するとこちらも文字列「google」に変えられています。
このように、どの場所で使おうと変数名が同じであれば同じ変数として扱われます。そのため、メインに戻った後の変数「hensu」には「google」が代入されていました。
ローカル変数を使用する
ローカル変数を利用するには、「setlocal」と「endlocal」コマンドを使用します。
使用方法はローカル変数を使いたい場所を「setlocal」と「endlocal」で囲みます。
1 2 3 4 5 |
setlocal [この中で使用した変数は外とは独立している] endlocal |
実際に使ってみましょう。前節のバッチプログラムを編集して、サブルーチン内の変数「hensu」をローカル変数にします。
以下、そのバッチファイル(local_hensu.bat)です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
@echo off rem 1回目の変数の設定 set hensu=yahoo echo メインプログラムの初め=%hensu% echo; rem サブルーチンの呼び出し call :subroutine echo メインプログラムの最後=%hensu% goto :eof :subroutine rem ここからローカル変数 setlocal rem 2回目の変数の設定 set hensu=google echo サブルーチンの中=%hensu% echo; rem ここまでローカル変数 endlocal exit /b |
前節のバッチファイルのサブルーチン内を「setlocal」と「endlocal」コマンドで囲っただけです(18行目と26行目)。
以下、実行結果です。
最後の「メインプログラムの最後=」の出力に注目して下さい。文字列「yahoo」のままとなっています。今度は、メインプログラムの「hensu」の中身は置き換えられていません。
これは、「setlocal」と「endlocal」コマンドで囲った部分で使用した変数は、その外側との変数とは別物として扱われたからです。
「setlocal」と「endlocal」は特にサブルーチン内だけに使えるものではなく、どこでも使えます。
上記のプログラムをサブルーチンを書かず以下のように書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
@echo off rem 1回目の文字列の代入 set hensu=yahoo echo メインプログラムの初め=%hensu% echo; rem ここからローカル変数 setlocal rem 2回目の文字列の代入 set hensu=google echo サブルーチンの中=%hensu% echo; rem ここまでローカル変数 endlocal echo メインプログラムの最後=%hensu% |
このようにしても、やはり「setlocal」と「endlocal」に囲まれた部分(10行目と18行目)の変数は違いうものとして扱われ、外の変数には影響を及ぼしません。
以下、実行結果です。
「setlocal」「endlocal」の外側で変数「hensu」に代入した中身(「yahoo」)は変化していません。
コメント