[前の記事]« ファイル内の行数を取得したい
[次の記事]空行(改行だけの行)を削除するには »

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

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

通常の展開と遅延展開のタイミング

460.
【難】二重ループの中での環境変数の遅延展開がおかしい
2005年05月13日(金) 13時45分
初心者
●DOS/Windowsのバージョン↓
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.


これは少し難しい話かもしれませんが
二重ループの中で、環境変数を設定して、取得したいのですが、
おかしな動きをします。
--------------------------------
SET FIRST_COUNT=1
:FIRST_LOOP
 if defined VAR!FIRST_COUNT! (
    REM VAR数字1~ 数個の環境変数を定義ずみで、取得したい
  REM これは取得できている
    echo !VAR%FIRST_COUNT%!

    SET SECOND_COUNT=1
    :SECOND_LOOP
    if defined VAR!FIRST_COUNT!!SECOND_COUNT! (
          REM VAR数字1数字2~ 数個の環境変数を定義ずみ
          REM 取得したい
          echo !VAR%FIRST_COUNT%%SECOND_COUNT%!
          REM が、なぜか、
          REM 数字2が1の場合、つまりSECOND_COUNTが1
          REM のとき、環境変数の値が取得できない!!!!!
          set /a SECOND_COUNT+=1
          goto SECOND_LOOP
    )

       

 )

set /a FIRST_COUNT+=1
goto FIRST_LOOP
--------------------------------
上のような状況にあります。
二重ループで、二重目のループないで、SECOND_COUNTが
1のとき、環境変数が取得できません。
遅延展開と関係あるのだと思いますが、理屈がよく
わかりません。


そして、SET SECOND_COUNT=1
の部分を
最初のIF文
if defined VAR!FIRST_COUNT!
の外にだしたら、取得できるようになりました。

これはどのような動きをしているのでしょうか?
難しくよくわかりません。

ごちゃごちゃしていてみません。
464.
Re:【難】二重ループの中での環境変数の遅延展開がおかしい
2005年05月13日(金) 15時38分
otn
>●DOS/Windowsのバージョン↓
>Microsoft Windows XP [Version 5.1.2600]
>(C) Copyright 1985-2001 Microsoft Corp.


>これは少し難しい話かもしれませんが
>二重ループの中で、環境変数を設定して、取得したいのですが、
>おかしな動きをします。

一連の「初心者」さんって、同一人物ですか?もしそうなら、今後はもうすこし特定性のあるハンドルでお願いします。

% による展開と ! による展開について、「% の展開が先で ! の展開が後」という風に理解されているように思えます。
以前書いたように、「% の展開は構文解析時、! の展開はコマンド実行直前」が正しい理解です。

 if defined VAR!FIRST_COUNT! (
の開き括弧に対応する閉じ括弧が約20行先の行頭の)であることの構文解析を行う時点で、そこまでの % による展開はすべてなされます。当然、括弧内の SET SECOND_COUNT=1 などまだ実行されておらず、if 実行前の %SECOND_COUNT% の内容(空?)が展開されます。

正しく動作させるためには、
if defined ~ (
 …
 …
)
をすべて、
if not defined ~ goto else01
 …
 …
:else01
のように書き直せばよいと思います。
もしくは、括弧内をサブルーチンにするか。
494.
Re2:【難】二重ループの中での環境変数の遅延展開がおかしい
2005年05月20日(金) 12時10分
初心者改めSH
>>●DOS/Windowsのバージョン↓
>>Microsoft Windows XP [Version 5.1.2600]
>>(C) Copyright 1985-2001 Microsoft Corp.
>>
>>
>>これは少し難しい話かもしれませんが
>>二重ループの中で、環境変数を設定して、取得したいのですが、
>>おかしな動きをします。

>一連の「初心者」さんって、同一人物ですか?もしそうなら、今後はもうすこし特定性のあるハンドルでお願いします。

>% による展開と ! による展開について、「% の展開が先で ! の展開が後」という風に理解されているように思えます。
>以前書いたように、「% の展開は構文解析時、! の展開はコマンド実行直前」が正しい理解です。

> if defined VAR!FIRST_COUNT! (
>の開き括弧に対応する閉じ括弧が約20行先の行頭の)であることの構文解析を行う時点で、そこまでの % による展開はすべてなされます。当然、括弧内の SET SECOND_COUNT=1 などまだ実行されておらず、if 実行前の %SECOND_COUNT% の内容(空?)が展開されます。

>正しく動作させるためには、
>if defined ~ (
> …
> …
>)
>をすべて、
>if not defined ~ goto else01
> …
> …
>:else01
>のように書き直せばよいと思います。
>もしくは、括弧内をサブルーチンにするか。


すみません、まだよくわからないのですが、
この場合は!VAR%FIRST_COUNT%%SECOND_COUNT%!
という形で全体を!で囲んでいて、遅延展開しているんです。
単純にecho %SECOND_COUNT%なら駄目なのはわかります。
412番で話題にしたケースと同じです。
498.
Re3:【難】二重ループの中での環境変数の遅延展開がおかしい
2005年05月20日(金) 13時50分
otn
>>一連の「初心者」さんって、同一人物ですか?もしそうなら、今後はもうすこし特定性のあるハンドルでお願いします。

強制したようですいません。ただ、同じ人だとわかると、以前の質問内容も勘案してコメントすることもできるので、SHさんもメリットあると思います。


>すみません、まだよくわからないのですが、
>この場合は!VAR%FIRST_COUNT%%SECOND_COUNT%!
>という形で全体を!で囲んでいて、遅延展開しているんです。
>単純にecho %SECOND_COUNT%なら駄目なのはわかります。
>412番で話題にしたケースと同じです。

構文解析時には、! は特殊文字ではありませんので、!のあるなしなどお構いなく、%FIRST_COUNT% や %SECOND_COUNT% を展開します。

遅延展開が有効かつ行に!がある場合は、コマンド実行の直前に ! を初めて特殊文字とみなしてコマンド行を再度展開して、それから実行されます。構文解析は終わってますから、! !による展開で構文(<,>,>>,|,&,||,&&,IF,FOR,括弧等)が変わるようなことはありません。

set "A=>X" と、Aに不等号とXをセットして、
echo %A% とすると、echo > X と同じですが、
echo !A! とすると、不等号とXが表示されます。

set X=IF 1==1 date/t
とセットして、
%X%
だとdate/tが実行されますが、
!X!
だと、「'IF' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。」のエラーになります。
500.
Re4:【難】二重ループの中での環境変数の遅延展開がおかしい
2005年05月20日(金) 14時28分
SH
>強制したようですいません。ただ、同じ人だとわかると、以前の質問内容も勘案してコメントすることもできるので、SHさんもメリットあると思います。

いえいえ、私もそろそろ名前を変えようと思っていましたので。


>構文解析時には、! は特殊文字ではありませんので、!のあるなしなどお構いなく、%FIRST_COUNT% や %SECOND_COUNT% を展開します。

なんとなくわかってきました。
すでにOtnさんにご指摘いただいたように、
>if defined VAR!FIRST_COUNT! (
>の開き括弧に対応する閉じ括弧が約20行先の行頭の)であること>の構文解析を行う時点で、そこまでの % による展開はすべてな>されます。
ということですか、
そして、ループして、2回目以降は、また次のタイミングで
%による展開がすべてなされると。
ただし、2回目以降はすでにSETコマンドが実行されているので、
問題なく動作するということみたいですね。

ところで、括弧内に括弧が含まれている場合も、一番外の
括弧までいっきに%の展開がされてしまうのでしょうか?
503.
Re5:【難】二重ループの中での環境変数の遅延展開がおかしい
2005年05月20日(金) 15時16分
otn
>ところで、括弧内に括弧が含まれている場合も、一番外の
>括弧までいっきに%の展開がされてしまうのでしょうか?

最初に開いた括弧がどこで閉じるのかがわからないと構文解析が完了しません。

set KAKKO=)
( nantoka
  for ..... in (...
  .....) do (
    kantoka
  )
%KAKKO% > tantaka
510.
Re6:ありがとうございました。
2005年05月20日(金) 19時13分
SH
>>ところで、括弧内に括弧が含まれている場合も、一番外の
>>括弧までいっきに%の展開がされてしまうのでしょうか?

>最初に開いた括弧がどこで閉じるのかがわからないと構文解析が完了しません。

>set KAKKO=)
>( nantoka
>  for ..... in (...
>  .....) do (
>    kantoka
>  )
>%KAKKO% > tantaka


>Otnさん

環境変数の遅延展開をやっと理解することができました。
ありがとうございました。
 
 


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

 

カテゴリー一覧

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


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

資料書籍

About

2005年05月13日 15:27に投稿されたエントリーのページです。

ひとつ前の投稿は「ファイル内の行数を取得したい」です。

次の投稿は「空行(改行だけの行)を削除するには」です。

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

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