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

« 比較したファイルの内容が異なるかどうかで条件分岐させるには | メイン | XCOPYで「システム丸ごとバックアップ」は可能? »

setコマンドの遅延展開について


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により処理を
振り分ける方法でバッチ処理をするようにいたします。

これからも宜しくお願いいたします。

カテゴリー

About

2002年07月10日 19:29に投稿されたエントリーのページです。

ひとつ前の投稿は「比較したファイルの内容が異なるかどうかで条件分岐させるには」です。

次の投稿は「XCOPYで「システム丸ごとバックアップ」は可能?」です。

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

Powered by
Six Apart
Movable Type 3.33-ja




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