こんなことを知りたい人へ向けて書いています
- Windowsバッチファイルでの変数の使い方を知りたい方
- ローカル変数として変数を使いたい方
- forループ内で変数を変化させる方法を知りたい方
- 通常の変数ではなく、日付など初めからデフォルト値が入っている特別な変数について知りたい方
- 変数同士を結合する方法を知りたい方
目次
その他の関連しそうな記事
バッチファイルで変数を使う
バッチファイルで変数を使用するには、「set」コマンドを使います。
使い方は以下の通りです。
1 |
set [変数名]=[変数に代入したい文字列や値] |
「set」コマンドの右側に記入した[変数名]に[変数に代入したい文字列や値]が格納されます。「=」の左右にはスペースは不要です。例えば、変数「x」に文字列「エックス」を代入したい場合は、
1 |
set x=エックス |
となります。
また、変数に代入した文字列を参照したいときは変数名を「%」で囲います(例:%x%)。
バッチファイルの例として、[変数名]の中身をコマンドプロンプトに表示させたい場合を考えましょう。変数「hensu」に文字列「井手ちゃんぽん」を代入するバッチファイル「hensu.bat」を以下に示します。
1 2 3 4 5 6 7 |
@echo off rem 変数「hensu」に文字列「井手ちゃんぽん」を代入 set hensu=井手ちゃんぽん rem 変数「hensu」の中身を確認 echo 変数「hensu」には「%hensu%」が代入されました。 |
4行目で変数「hensu」に「井手ちゃんぽん」を代入し、7行目の「%hensu%」でその中身を参照しています。
このように、変数に代入するときは「set」コマンドを使い、その代入した変数を参照したいときは「%変数名%」とします。
以下の図は上記のバッチファイルの実行結果です。7行目の「echo」コマンドによる出力を見てみましょう。
「%hensu%」に「井手ちゃんぽん」が入って出力されたのが分かると思います。
「set」コマンドには、ここで紹介した変数代入の機能の他にも、「ユーザーからの入力情報を受け取る」機能や「簡単な計算を行う」機能があります。詳細は「set (変数の設定・計算・ユーザーからの入力情報の取得) -コマンド別解説-」をご覧下さい。
日本語の変数を使う
本節は余談的な内容です。
変数には日本語も使用できます。以下のバッチファイルは変数に日本語を使用した例です。
1 2 3 4 5 6 7 |
@echo off rem 日本語の変数に文字列を代入 set 佐賀のちゃんぽん屋=井手ちゃんぽん rem 日本語の変数の内容を表示 echo 変数「佐賀のちゃんぽん屋」には「%佐賀のちゃんぽん屋%」が代入されました。 |
この場合、4行目の「set」コマンドの右側の「佐賀のちゃんぽん屋」が変数となり、右辺の文字列「井手ちゃんぽん」がこの変数に代入されています。
使い方はアルファベットの時と全く同じです。なんだか、少し変な感じですが、これも立派な変数となっています。
以下、このバッチファイルを実行した結果です。7行目の「echo」コマンドによる出力を見てみましょう。
きちんと、「%佐賀のちゃんぽん屋%」に文字列「井手ちゃんぽん」が代入されているのが確認できました。
ただし、日本語の変数はあまり推奨しません。特に理由がない限りはアルファベットの変数を用いた方が無難でしょう。
ローカル変数を使用する
ローカル変数という言葉に馴染みがない方もいるかもしれませんので、まずは以下のバッチファイルを見て下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
@echo off rem 変数「hensu」に文字列「井手ちゃんぽん」を代入 set hensu=井手ちゃんぽん rem --- ローカル変数の使用を開始 --- setlocal rem 変数「hensu」に文字列「長崎ちゃんぽん」を代入 set hensu=長崎ちゃんぽん rem 変数「hensu」の中身を確認 echo (1回目)変数「hensu」には「%hensu%」が代入されました。 rem --- ローカル変数の使用を終了 --- endlocal rem 変数「hensu」の中身を確認 echo (2回目)変数「hensu」には「%hensu%」が代入されました。 |
4行目に「hensu」変数に文字列「井手ちゃんぽん」を代入しています。
9行目の「setlocal」が今回注目するコマンドであり、ローカル変数の開始を表すものですが、これについては後で説明します。
9行目の「setlocal」を実行した後、12行目で再度、「hensu」変数に文字列「長崎ちゃんぽん」を代入しています。変数「hensu」には、4行目にはじめに「井手ちゃんぽん」を代入していましたが、ここで「長崎ちゃんぽん」に上書きされたように見えます。これで変数「hensu」には「長崎ちゃんぽん」が入っているのでしょうか。15行目では変数「hensu」の中身をコマンドプロンプトに出力して確認しています。
18行目の「endlocal」コマンドは「setlocal」コマンドと対になるもので、これについても後で説明します。
最後に23行目に再び変数「hensu」の中身をコマンドプロンプトに出力して確認しています。
では、このバッチファイルを実行してみましょう。以下が実行結果です。
1回目の出力(15行目)では変数「hensu」に文字列「長崎ちゃんぽん」が入っています。その直前(12行目)で、「set」コマンドによって代入したので当然ですね。
一方、2回目の出力(23行目)では「井手ちゃんぽん」が入っています。1回目と2回目の出力コマンドの間には変数を代入する操作は無いにもかかわらず、代入されている文字列が異なるのはなぜでしょう。
それは、「setlocal」と「endlocal」コマンドで囲まれている区間(ここでは、9行目から18行目)で使われた変数は、名前が同じ変数でもこの区間外で使用された変数とは全く別の変数として扱われるからです。したがって、4行目の「hensu」と12行目の「hensu」は全く別の変数として扱われているのです。
このように、決まった区間内でのみ有効な変数をローカル変数と呼びます。ローカル変数区間の始まりを「setlocal」、終わりを「endlocal」を使って指定します。
ループ内で変数を変化させる
まず、「ループ内で変数を変化させる」とはどういうことかを説明します。以下のバッチファイル「for_loop_variable.bat」を見てください。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@echo off rem 変数「count」を定義して初期値0を代入 set count=0 rem 7回ループ for /l %%n in (1,1,7) do ( rem 変数「count」に+1する set /a count=%count%+1 rem 変数「count」の値をチェック echo count=%count% ) |
このバッチファイルは変数「count」をforループ内で+1していくといった動作をさせたくて作ったものです。
4行目で変数「count」に初期値0を代入し、7行目からのforループ内において9行目で「count」に1を足しています。12行目はforループ内で変数「count」の値をチェックしています。
このバッチファイルを実行してみましょう。
7回ループは回っているようですが、「count」の値はすべて0です。9行目で1を足しているはずですが、それが反映されていません。この理由を詳しく知りたい方は「forループの中で値を変化させる -やりたいことから検索-」で詳しく解説していますのでそちらを参照してください。ここでは、通常通りforループ内で変数を使用しても、上手くいかない事だけを覚えておきましょう。
では、どのようにコードを記述するれば、forループ内で変数を変化させることができるのでしょうか。それには、「setlocal enabledelayedexpansion」と「endlocal」を使用します。forループを「setlocal enabledelayedexpansion」と「endlocal」で囲むのです。
そしてもう一つ、通常は変数を参照する際、「%」で囲んていましたが、代わりに「!」を使いましょう。
この2つを使って、上記のバッチファイルを書き換えると、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
@echo off rem 変数「count」を定義して初期値0を代入 set count=0 rem ループ内で変数を変化させるためのもの setlocal enabledelayedexpansion rem 7回ループ for /l %%n in (1,1,7) do ( rem 変数「count」に+1する set /a count=!count!+1 rem 変数「count」の値をチェック echo count=!count! ) endlocal |
となります。7行目と最終行に「setlocal enabledelayedexpansion」と「endlocal」を加えてforループを囲んでいます。また、forループ内の「count」は「!」を使って参照していることに注目しましょう(12行目と15行目)。
これを実行すると、以下のようになります。
今度は思い通りに「count」の値が変化しています。もう一度まとめると、forループ内で変数を変化させたい場合は、次の2つに注意してバッチファイルを作成しましょう。
- forループを「setlocal enabledelayedexpansion」と「endlocal」で囲む
- 変数の参照は「!」を使う
変数を結合する
次は変数を結合する操作を紹介します。二つの変数を結合するには以下のように書きます。
1 |
set [結合後変数名]=%[結合前変数名①]%%[結合前変数名②]% |
ただ、結合したい2つの変数を並べるだけです。これで、[結合後変数名]には[結合前変数名①][結合前変数名②]の文字列が代入されます。例として、以下にバッチファイル「hensu_joint.bat」を示します。
1 2 3 4 5 6 7 8 9 10 11 |
@echo off rem 変数を定義 set hensu1=佐賀の set hensu2=井手ちゃんぽん rem 変数の結合 set hensu3=%hensu1%%hensu2% rem 変数を確認 echo %hensu3% |
4, 5行目は結合前の2つの変数を定義して、それぞれに文字列を代入しています。
8行目でその2つの変数を結合しています。最後の行は結合後の変数をコマンドプロンプトに表示させ、確認するコマンドです。
以下が上記のバッチファイルの実行結果です。
2つの変数の内容が結合されていることが分かります。
3つ以上の変数を結合させるときも同様で、結合したい変数を並べて書くだけでオッケーです。また、変数の前後に挿入したい文字列を書くこともできます。以下にサンプルのバッチファイル「hensu_joint_2.bat」を示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
@echo off rem 変数を定義 set hensu1=佐賀 set hensu2=の set hensu3=井手ちゃんぽん rem 3つの変数の結合 set hensu4=%hensu1%%hensu2%%hensu3% rem 変数の前後に任意の文字列を挿入 set hensu5=一番好きな店は%hensu1%市にある%hensu3%です。 rem 変数を確認 echo %hensu4% echo %hensu5% |
前回のバッチファイルの内容を少し編集して、9行目には3つの変数の結合する例を、12行目には変数の前後に任意の文字列を挿入する例を示しました。実行結果は以下のようになります。
はじめから値が入っている特殊な変数
ここまでは、「set」コマンドを用いてユーザーが自ら変数の中身に文字列や値を設定する方法を見てきました。その変数を参照するには「%変数名%」を使えばよいことも述べましたが、設定していない変数を参照するとどうなるでしょう。
以下は変数「noset」という中身に何も代入していない変数を参照したバッチファイル例(refer_noset.bat)です。
1 2 3 |
@echo off echo 変数「noset」には「%noset%」が格納されています。 |
これを実行してみましょう。以下のようになります。
「」となっており、何も入っていません。これは予想通りの結果です。
では、変数「date」について同じことをやってみましょう。
1 2 3 |
@echo off echo 変数「date」には「%date%」が格納されています。 |
変数「date」には何も代入していないにもかかわらず、「2017/09/11」という今日の日付が格納されています。このように、ユーザーが代入しなくとも、文字列や値が既に入っている変数が存在します。以下に、そのような変数の一覧表を示します。
%CD% | 現在いるフォルダのパス(例:C:\Users\username\Desktop\バッチ) |
%DATE% | 今日の日付(例:2017/09/11) |
%TIME% | 現在の時刻(例:13:15:11.63) |
%RANDOM% | 0 から 32767までの整数をランダムに表示(例:17469) |
%ERRORLEVEL% | 直前のコマンドが正常に終了したか、異常終了したかを判定する値 |
%CMDEXTVERSION% | 現在のコマンド プロセッサ拡張機能のバージョン番号 |
%CMDCMDLINE% | コマンド プロセッサを起動したオリジナル コマンド ライン |
%HIGHESTNUMANODENUMBER% | コンピューター上の最大NUMAノード番号 |
この中でよく使うのは「%cd%」、「%date%」、「%time%」の3つです。Windowsバッチファイル初心者の方はとりあえずこの3つを覚えておきましょう。
少しバッチファイルに慣れて、様々なものをバッチファイルで作ろうとしたときには、ランダム数を取得する「%random%」、直前のコマンドが正常に終了したか、異常終了したかを確認できる「%errorlevel%」を使うようになります。「%errorlevel%」については、「errorlevel(終了コードを取得する) -コマンド別解説-」や「errorlevelの値から分岐処理を行う -やりたいことから検索-」なで詳しく解説しています。
一覧の最後の3つは管理者レベルでも滅多に使わないので、とりあえずは覚えなくてよいでしょう。
これで、バッチファイルで変数を使う方法に関してはある程度の知識が身についたと思います。後はどんどん実践の中で使っていきながら学んでいきましょう。
set COLORF=-vf colorlevels=rimin=-0.058:gimin=0.058:bimin=0.058
こんな場合、エラーになっちゃう。どうしたら??