|
461) setコマンドの遅延展開について こう 2002/07/10(水) 13:42 |
|
はじめまして、こうといいます。 質問があるのですが 下記の様なバッチファイルを作成し実行したところ echo AAAAAAAAAA の行が実行されませんでした。 どうやら2つめのif文ではAの値がabcになっているようなのです。 最初のecho %A%でabcと出力される。 最後のecho %A%ではdefと出力される。 OS:Win2K(SP2)です。 --------------------------------- set A=abc if %A% == abc ( set A=def echo %A% if %A% == def( echo AAAAAAAAAA ) ) echo %A% --------------------------------- set /? によりヘルプをみると 遅延環境変数の展開という機能が働いているようなのですが、 よくわかりません ヘルプ通りに if !A! == def( のように!(感嘆符)で囲んでもできませんでした。 上記バッチにて echo AAAAAAAAAA を出力する方法を教えていたたきたく、本ページに書き込みさせていただきました。 宜しくお願いいたします。 |
|
462) Re:setコマンドの遅延展開について SYSOP 2002/07/10(水) 15:44 |
|
こう さん、こんにちは。 とりあえず、ご質問の操作は在来のDOS/Windowsの文法でなら下記のような構文で書くことができ、その場合はプラットホームがWindows2000であろうがDOS3.Xであろうが確実に動作します。 set a=abc if not "%a%"=="abc" goto endif01 set a=def echo 環境変数aは"%a%"です。 if not "%A%"=="def" goto endif02 echo AAAAAAAAAA :endif02 :endif01 echo %A% で、以下、Windows2000のSETやCMDのヘルプに書いてあること(ものすごい悪文(^^;)をぼくなりに換骨奪胎して要旨を書くと、こんな感じになっているようです。 ・コマンドラインの解釈実行では、1つの行内で同じ環境変数を変更したり何度も参照したりする書き方をした場合、すべて一括でその時点の環境変数の内容に置き換えられてしまう。 このため、ユーザーが常識的に期待するであろう結果にならないことがある(そういう仕様である)。 特にこの現象は、Windows2000のバッチファイルの文法の拡張部分である[ ()で処理をグループ化する ]機能との組み合わせで、問題を発生させやすい。 そこで、これを解決するオプション=遅延環境変数展開機能をあわせて用意してある(CMD /V:ON。詳しくはCMD /? 参照)が、デフォルトではオフになっている。常時このオプションがオンの設定にするには、レジストリの書き換えが必要である。 ……こう さんのご質問にある!A!のような書き方は、その「デフォルトではオフになっている機能」を「オンにした」場合にだけ使えるものです。 ただ、これをオンにすればしたで、結局その環境に依存した書き方しかできなくなってしまうわけで、どうも屋上屋を重ねたような仕様だなあというのが正直な感想です。 ()でのグループ化自体は便利といえば便利な仕様ですけど、どちらかといえば()内やFOR内で環境変数をいじる書き方自体を避けたほうが無難、とうけとめたほうがいいかもしれません。 YanaKen |
|
464) Re:setコマンドの遅延展開について こう 2002/07/10(水) 17:29 |
|
SYSOP 様 回答ありがとうございました。 ()でのグループ化はとても便利なので今まで良く使っていました。 ご指摘の通り、環境変数をいじる場合などは、従来のgotoにより処理を 振り分ける方法でバッチ処理をするようにいたします。 これからも宜しくお願いいたします。 |