[前の記事]« FTPコマンドにそのつどパラメータを渡すバッチ処理
[次の記事]バッチでDOS窓を表示させたくない »

関連オンラインソフト配布サイト:
Vector>ダウンロード(top) |>MS-DOSまたは汎用 | >WindowsVista/XP/2000/NT

▲カテゴリー「遅延環境変数の展開」索引へ

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

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


カテゴリー「遅延環境変数の展開」索引へ

 

カテゴリー一覧

FPCU/FPCDIY QUICK LINK online
この上の各ジャンル名をクリックすると、下のウィンドウが切り替わります▼


=リンク集のインデックスはこちら=

資料書籍

About

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

ひとつ前の投稿は「FTPコマンドにそのつどパラメータを渡すバッチ処理」です。

次の投稿は「バッチでDOS窓を表示させたくない」です。

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

This site is powered by Six Apart
Movable Type 3.33-ja
このブログについて | 運営:有限会社メディアポート