掲示板トップページへ | 掲示板直行(ツリー一覧) | タイトル一覧 | 本文一覧
このブログのトップへ
カテゴリー「IF(結果の検査、条件分岐)」索引へ
カテゴリー「SET, PATH, %環境変数%」索引へ

« テキスト出力項目をSQLPLUSに渡すには? | メイン | XCOPY:「コピーを実行できません」のエラー »

[NT系]IF文の内と外では環境変数の扱いが違うのでしょうか?(遅延環境変数問題)

92.
IF文の内と外では環境変数の扱いが違うのでしょうか?
2004年01月15日(木) 18時00分
まー坊

はじめまして、まー坊と言います。

バッチの文法でお聞きしたいことがあり、書込みさせていただきました。

ファイルの内容をFOR文で取得して環境変数にセットしたいのですが、
IF文の外側で実行するとセットできるのに、IF文の内側で実行するとセットできません。
IF文の内と外側では環境変数の扱い方が違うのでしょうか?
環境はWindows2000です。


ts.bat
----- ここから -----

    @echo off
    if %1% EQU 0 (
        echo 100 > data.dat
        for /F %%i in (data.dat) do set cnt=%%i
        echo %cnt%
    ) 

    echo 100 > data.dat
    for /F %%i in (data.dat) do set cnt2=%%i
    echo %cnt2%

----- ここまで -----


実行結果

    C:\>ts 0    
    ECHO は <OFF> です。        ← IF文の内側でセットした結果
    100                           ← IF文の外側でセットした結果
94.
Re:IF文の内と外では環境変数の扱いが違うのでしょうか?
2004年01月15日(木) 18時39分
じゃく
>ファイルの内容をFOR文で取得して環境変数にセットしたいのですが、
>IF文の外側で実行するとセットできるのに、IF文の内側で実行するとセットできません。
>IF文の内と外側では環境変数の扱い方が違うのでしょうか?
IF文で指定している複合文(括弧でくくっている箇所)に含まれる
環境変数(この場合 echo %cnt% の %cnt% )はIF文が実行される
とき(つまりfor文が実行される前)に評価されてしまうからです。
詳しくは、set /? で表示されるヘルプの中にある、遅延環境変数の展開の説明がわかりやすいと思います。
98.
遅延環境変数というのがあるんですね
2004年01月16日(金) 13時19分
まー坊
>IF文で指定している複合文(括弧でくくっている箇所)に含まれる
>環境変数(この場合 echo %cnt% の %cnt% )はIF文が実行される
>とき(つまりfor文が実行される前)に評価されてしまうからです。
>詳しくは、set /? で表示されるヘルプの中にある、遅延環境変数の展開の説明がわかりやすいと思います。

じゃくさん、回答をありがとうございます。

IF文の内と外側でも環境変数の扱い方は同じだと思っていました。
遅延環境変数と言うのを知らなかったので、自分の構文が間違っているのかと
思っていました(使い方を間違ってはいるんですが・・・)。
IF文の中からCALLを使用して別のバッチを呼び出して、その戻り値を
環境変数(または%ERRORLEVEL%)で取得しようとしていて、この問題に
ぶち当たりました。
別の手法を考えてみることにします。
ありがとうございました。
107.
Re3:遅延環境変数というのがあるんですね
2004年01月16日(金) 21時39分
ふぇむ
>IF文の中からCALLを使用して別のバッチを呼び出して、その戻り値を
>環境変数(または%ERRORLEVEL%)で取得しようとしていて、この問題に
>ぶち当たりました。
>別の手法を考えてみることにします。

いえ、別の手法の必要はなく、変数の遅延展開はまさにそのような場合のためにあると思ったほうがいいです。単純に、バッチ最初のsetlocal 時点で  ENABLEDELAYEDEXPANSION を指定しておくだけで、!変数! で値が参照できるわけですから。それだけの修正ですむと思いますよ。
119.
出来ました!!
2004年01月19日(月) 15時21分
まー坊
>いえ、別の手法の必要はなく、変数の遅延展開はまさにそのような場合のためにあると思ったほうがいいです。単純に、バッチ最初のsetlocal 時点 で ENABLEDELAYEDEXPANSION を指定しておくだけで、!変数! で値が参照できるわけですから。それだけの修正ですむと思います よ。


!環境変数名!の変更だけで出来ました。
ありがとうございました。助かりました。
 

カテゴリー

About

2004年01月15日 11:21に投稿されたエントリーのページです。

ひとつ前の投稿は「テキスト出力項目をSQLPLUSに渡すには?」です。

次の投稿は「XCOPY:「コピーを実行できません」のエラー」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Six Apart
Movable Type 3.33-ja




このブログについて | 運営:有限会社メディアポート