2014.
11.
22
14:06:18
結論から書くと、遅延環境変数の展開を使って
でいけますよ。
それでは、詳細を書いていきます。
お客さま先の新人さんから
バッチファイルを作ってるんですけど、for文の中でインクリメントできません(つд`)
と泣きが入りました。
コードを見せてもらうと、こんな感じですφ(--)
ちなみに、一部の処理を抜粋しています。
新人さんが実際に書いていたコードはもう少し複雑でした。
それにしても新人さんの書いたこのコード、一見するとおかしそうなところは無いですね……。
と言ってあげたいのですが、あぁ、こりゃー駄目っすね(^^;
バッチファイルにおける環境変数は、コードの読み込み時に値に置き換えられます。
だから「for ~ ( ~ )」の行を読み込んだ時点で「%num%」は「0」に置き換わるのです。
つまり新人さんが書いたコードは、実質これと同じφ(--)
そりゃー、延々「0」が出力されますわ(ノ∀`)
これを何とかするためには、変数が値に置き換えられるタイミングを
コードの「読み込み時」から「実行時」に変えてあげなくてはいけません。
そこで登場するのが「遅延環境変数の展開」です。
言葉は難しそうな響きですが、大したことはありません。
単に「変数の展開を読み込み時じゃなくて実行時にしてけろ!」な指定なだけです。
実際に遅延環境変数の展開を行うには「setlocal」に「enabledelayedexpansion」を指定しておいて、
変数の参照時にはパーセント(%)ではなくエクスクラメーションマーク(!)で囲みます。
つまり、コードの上の方に
と書いておいて、変数の中身を参照する際には
と書けば、読み込み時ではなく実行時に値に置き換えられます。
それを踏まえて、新人さんの書いたコードをこんな感じに変更するとφ(--)
無事に、forループの中で数値がインクリメントされるようになりました。
完了\(--)/
@echo off
setlocal enabledelayedexpansion
set num=0
for /L %%i in (1, 1, 10) do (
set /a num=num+1
echo !num!
)
pause
setlocal enabledelayedexpansion
set num=0
for /L %%i in (1, 1, 10) do (
set /a num=num+1
echo !num!
)
pause
でいけますよ。
それでは、詳細を書いていきます。
お客さま先の新人さんから
バッチファイルを作ってるんですけど、for文の中でインクリメントできません(つд`)
と泣きが入りました。
コードを見せてもらうと、こんな感じですφ(--)
@echo off
set num=0
for /L %%i in (1, 1, 10) do (
set /a num=num+1
echo %num%
)
pause
set num=0
for /L %%i in (1, 1, 10) do (
set /a num=num+1
echo %num%
)
pause
ちなみに、一部の処理を抜粋しています。
新人さんが実際に書いていたコードはもう少し複雑でした。
それにしても新人さんの書いたこのコード、一見するとおかしそうなところは無いですね……。
と言ってあげたいのですが、あぁ、こりゃー駄目っすね(^^;
バッチファイルにおける環境変数は、コードの読み込み時に値に置き換えられます。
だから「for ~ ( ~ )」の行を読み込んだ時点で「%num%」は「0」に置き換わるのです。
つまり新人さんが書いたコードは、実質これと同じφ(--)
@echo off
set num=0
for /L %%i in (1, 1, 10) do (
set /a num=num+1
echo 0
)
pause
set num=0
for /L %%i in (1, 1, 10) do (
set /a num=num+1
echo 0
)
pause
そりゃー、延々「0」が出力されますわ(ノ∀`)
これを何とかするためには、変数が値に置き換えられるタイミングを
コードの「読み込み時」から「実行時」に変えてあげなくてはいけません。
そこで登場するのが「遅延環境変数の展開」です。
言葉は難しそうな響きですが、大したことはありません。
単に「変数の展開を読み込み時じゃなくて実行時にしてけろ!」な指定なだけです。
実際に遅延環境変数の展開を行うには「setlocal」に「enabledelayedexpansion」を指定しておいて、
変数の参照時にはパーセント(%)ではなくエクスクラメーションマーク(!)で囲みます。
つまり、コードの上の方に
setlocal enabledelayedexpansion
と書いておいて、変数の中身を参照する際には
echo !num!
と書けば、読み込み時ではなく実行時に値に置き換えられます。
それを踏まえて、新人さんの書いたコードをこんな感じに変更するとφ(--)
@echo off
setlocal enabledelayedexpansion
set num=0
for /L %%i in (1, 1, 10) do (
set /a num=num+1
echo !num!
)
pause
setlocal enabledelayedexpansion
set num=0
for /L %%i in (1, 1, 10) do (
set /a num=num+1
echo !num!
)
pause
無事に、forループの中で数値がインクリメントされるようになりました。
完了\(--)/