[前の記事]« "a"で始まる名前のディレクトリだけバックアップしたい
[次の記事]日付の取得:NT環境ではどうすれば・・・ »

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

▲カテゴリー「FOR .. IN ( ) DO..」索引へ

[NT系] FORのオプションをバッチ内で動的に設定することは可能?

553.
FORのオプションを動的に設定するには?
2004年06月24日(木) 10時40分
ウエイン
FORのオプションの設定を動的に変更する方法を模索しております。
以下のスクリプトを実行したのですがうまくいきません。

SETLOCAL ENABLEDELAYEDEXPANSION
  FOR /F  "delims=" %%A in (SAMPLE.CSV) do (
    set WK_DATA=%%A
    FOR /L %%i in (1,1,7) do (
      FOR /F  "delims=, tokens=%%i"  %%B in ("!WK_DATA!") do (
        echo %%B
      )
    )
  )
ENDLOCAL

このようにすると%%iがうまく展開されません。
また以下の様にも試したのですがうまくいきません。

SETLOCAL ENABLEDELAYEDEXPANSION
  FOR /F  "delims=" %%A in (SAMPLE.CSV) do (
    set WK_DATA=%%A
    FOR /L %%i in (1,1,7) do (
      set OPT=delims=, tokens=%%i
      FOR /F  "!OPT!"  %%B in ("!WK_DATA!") do (
        echo %%B
      )
    )
  )
ENDLOCAL

この場合でも!OPT!が展開されないようです。

何かよい方法はありますでしょうか?
555.
Re:FORのオプションを動的に設定するには?
2004年06月24日(木) 14時43分
YanaKen
ウエインさん こんにちは。

 SAMPLE.CSVの中身が不明なので推測がまじりますし、実地にやりたい処理はさらに複雑なのかもしれませんが、拝見したバッチファイルの処理内容 で判断する限り、そこまでFOR文を多重化したり、オプションを動的に変更したりする必要はあまりなさそうな印象を受けました。たとえば下記のような処理 でも済むのでは……。

●sample.csvの内容例
abc,cde,efg,hij,klm,opq,rst,uvw,xyz
111,222,333,444,555,666,777,888,999

●バッチファイルの内容
@echo off
FOR /F "delims=, tokens=1-7" %%A in (SAMPLE.CSV) do (
  call :eachloop %%A  %%B  %%C  %%D  %%E  %%F  %%G
)
exit /b
:eachloop
if %1.==. exit /b
echo %1
shift
goto eachloop

●上記の実行結果
abc
cde
efg
hij
 ...(以下略)

 どうしても "delims=? tokens=?"の部分を動的に変更する必要がある、という場合は(どうも仕様上そういうことはできないしくみみたいなので)、echo でいったん別のバッチファイルに書き出すかたちが考えられると思います。(「%」とか「)」のような特殊な意味を持つ文字がからむため、そのへんのフォローが複雑だし、処理も遅くなるとは思いますが……)

YanaKen
557.
Re2:FORのオプションを動的に設定するには?
2004年06月24日(木) 19時22分
ウエイン
ご回答ありがとうございます。

ここでのサンプルではファイルの1レコードあたり10項目以内ですが、
30項目以上ある場合もこの方法が良いのでしょうか?
559.
Re:FORのオプションを動的に設定するには?
2004年06月24日(木) 21時19分
oo
>FORのオプションの設定を動的に変更する方法を模索しております。
>以下のスクリプトを実行したのですがうまくいきません。

>SETLOCAL ENABLEDELAYEDEXPANSION
>  FOR /F  "delims=" %%A in (SAMPLE.CSV) do (
>    set WK_DATA=%%A
>    FOR /L %%i in (1,1,7) do (
>      FOR /F  "delims=, tokens=%%i"  %%B in ("!WK_DATA!") do (
>        echo %%B
>      )
>    )
>  )
>ENDLOCAL

>このようにすると%%iがうまく展開されません。
>また以下の様にも試したのですがうまくいきません。

>SETLOCAL ENABLEDELAYEDEXPANSION
>  FOR /F  "delims=" %%A in (SAMPLE.CSV) do (
>    set WK_DATA=%%A
>    FOR /L %%i in (1,1,7) do (
>      set OPT=delims=, tokens=%%i
>      FOR /F  "!OPT!"  %%B in ("!WK_DATA!") do (
>        echo %%B
>      )
>    )
>  )
>ENDLOCAL

>この場合でも!OPT!が展開されないようです。

>何かよい方法はありますでしょうか?

for文やif文の構文解析は、(1)%による環境変数展開や(2)%1等のCALL引数展開の後で、(3)forの制御変数展開や(4)!による遅延環 境変数展開の前に行われますので、for のオプションを変更したいなら上記(1)(2)を使う必要があります。従って for の ( ) 内で使うこ とは出来ず、サブルーチン化する必要があります。

(前略)
for /L %%i in (1,1,7) do call :sub %%i
(中略)
:sub
FOR /F  "delims=, tokens=%1"  %%B in ("!WK_DATA!") do (
(後略)
または、
(前略)
for /L %%i in (1,1,7) do set OPT=delims=, tokens=%%i&call :sub
(中略)
:sub
FOR /F  "%OPT%"  %%B in ("!WK_DATA!") do (
(後略)
570.
Re3:FORのオプションを動的に設定するには?
2004年06月25日(金) 12時49分
YanaKen
ウエインさん こんにちは。

>ここでのサンプルではファイルの1レコードあたり10項目以内ですが、
>30項目以上ある場合もこの方法が良いのでしょうか?

 前回書いた処理そのままだと%%Aから%%Zまで、最大26項目がとりあえずの項目数の限界になると思います。(forの仕様)
 もっとたくさん必要ということなので、前回の延長線上で、データ個数の自由度が高いサンプルを作ってみました。
 ただ、前回のも今回のも、読み込むデータ形式によっては期待通り動かない場合があるかもしれません。具体的には、各データ内に半角スペースなどデリミタとして機能する文字が混在し、かつ、それらが""で囲まれていない場合は、データがずれちゃうと思います。

●sample.csv
あ,い,う,え,お,か,き,く,け,こ,さ,し,す,せ,そ,た,ち,つ,て,と,な,に,ぬ,ね,の,は,ひ,ふ,へ,ほ,ま,み,む,め,も,や,ゆ,よ,わ,を,ん
い,う,え,お,か,き,く,け,こ,さ,し,す,せ,そ,た,ち,つ,て,と,な,に,ぬ,ね,の,は,ひ,ふ,へ,ほ,ま,み,む,め,も,や,ゆ,よ,わ,を,ん
う,え,お,か,き,く,け,こ,さ,し,す,せ,そ,た,ち,つ,て,と,な,に,ぬ,ね,の,は,ひ,ふ,へ,ほ,ま,み,む,め,も,や,ゆ,よ,わ,を,ん

●sample.bat
@echo off
FOR /F "tokens=*" %%A in (SAMPLE.CSV) do (
  call :eachloop %%A
)
exit /b

:eachloop
  set count=1
:loop
if %1.==. exit /b
if %count%==31 exit /b
echo %1
shift
set /A count=%count%+1
goto loop

YanaKen
 

 

553.FORのオプションを動的に設定するには? ウエイン 04/06/24(木) 10:40
555.Re:FORのオプションを動的に設定するには? YanaKen 04/06/24(木) 14:43
557.Re2:FORのオプションを動的に設定するには? ウエイン 04/06/24(木) 19:22
570.Re3:FORのオプションを動的に設定するには? YanaKen 04/06/25(金) 12:49
559.Re:FORのオプションを動的に設定するには? oo 04/06/24(木) 21:19
 
 


カテゴリー「FOR .. IN ( ) DO..」索引へ

 

カテゴリー一覧

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


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

資料書籍

About

2004年06月24日 11:59に投稿されたエントリーのページです。

ひとつ前の投稿は「"a"で始まる名前のディレクトリだけバックアップしたい」です。

次の投稿は「日付の取得:NT環境ではどうすれば・・・」です。

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

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