[前の記事]« 別のバッチファイルの呼び出しがうまくいかない
[次の記事]配布したファイルをデスクトップにコピーするバッチ処理 »

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

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

FOR文でワイルドカードを用いた変数を2つ使うには


792) for文について KIT 2003/11/06(木) 10:27


for文でワイルドカードを用いた変数を2つ使いたいのですがうまくできません。

for /d %%a in (?-*) do del "%%a\*.lst"

のようにワイルドカードを用いた変数を1つ使うことはできるのですが2つになると…。誰か使い方を知っておられる方、教えていただけないでしょうか。

よろしくお願い致します。

793) Re:for文について じゃく 2003/11/06(木) 10:40


>for文でワイルドカードを用いた変数を2つ使いたいのですがうまくできません。

>for /d %%a in (?-*) do del "%%a\*.lst"

>のようにワイルドカードを用いた変数を1つ使うことはできるのですが2つになると…。誰か使い方を知っておられる方、教えていただけないでしょうか。

OSは何でしょう?
どの部分を2つ指定したいのですか?
for文のなかのディレクトリ名なら、複数指定できます。
例えば
for /d %%a in (?-* sample* ex?) do del "%%a\*.lst"
もしくはfor文を並べるか、
echo off
for /d %%a in (?-*) do del "%%a\*.lst"
for /d %%a in (sample*) do del "%%a\*.lst"
for /d %%a in (ex?) do del "%%a\*.lst"

解釈間違ってますか?

794) Re2:for文について KIT 2003/11/06(木) 10:50


>>for文でワイルドカードを用いた変数を2つ使いたいのですがうまくできません。
>>
>>for /d %%a in (?-*) do del "%%a\*.lst"
>>
>>のようにワイルドカードを用いた変数を1つ使うことはできるのですが2つになると…。誰か使い方を知っておられる方、教えていただけないでしょうか。

>OSは何でしょう?
>どの部分を2つ指定したいのですか?
>for文のなかのディレクトリ名なら、複数指定できます。
>例えば
>for /d %%a in (?-* sample* ex?) do del "%%a\*.lst"
>もしくはfor文を並べるか、
>echo off
>for /d %%a in (?-*) do del "%%a\*.lst"
>for /d %%a in (sample*) do del "%%a\*.lst"
>for /d %%a in (ex?) do del "%%a\*.lst"

>解釈間違ってますか?

じゃくさん、こんにちは。

OSはWin XPです。今回はディレクトリとファイルをそれぞれ別のワイルドカード変数で指定しようとしています。さらに今回は削除ではなくてコンパイルを行おうとし ているので、オプションがあり、do以降で"%%a\*.lst"のように""でくくることもできません。このような感じでやりたいことがわかるでしょう か?

よろしくお願いいたします。


796) Re3:for文について ふぇむ 2003/11/06(木) 11:34


>OSはWin XPです。今回はディレクトリとファイルをそれぞれ別のワイルドカード変数で指定しようとしています。

ディレクトリも複数、ファイルも複数、ですね。
複雑なほど、ターゲットのリストを作成する処理とリストに基づく処理に分けたほうがいいと思います。リストが正しいかどうかの検証も必要でしょうし。必要ならリストを awk 他なんらかの別ツールで加工してもよいし。


>さらに今回は削除ではなくてコンパイルを行おうとしているので、


言語は何ですか? C とかなら make とかがあるでしょうし、Java なら ant とかがあるので、それを使う方がよくないでしょうか。


>オプションがあり、do以降で"%%a\*.lst"のように""でくくることもできません。

ここはいまいちわかりません。"" でくくるのはファイル名部分だけだと思いますが、オプションはその外側で与えるものでは?コマンドラインで起動できるものなら同様に指定できると思いますが....



797) Re3:for文について じゃく 2003/11/06(木) 13:58


>じゃくさん、こんにちは。

>OSはWin XPです。今回はディレクトリとファイルをそれぞれ別のワイルドカード変数で指定しようとしています。さらに今回は削除ではなくてコンパイルを行おうとし ているので、オプションがあり、do以降で"%%a\*.lst"のように""でくくることもできません。このような感じでやりたいことがわかるでしょう か?

KITさん
正直、よんでもよくわかりませんでした。

・どのようなディレクトリ構成か
・どのようなファイルを対象としたいのか
・ディレクトリ、ファイルでどのようなワイルドカードが使いたいのか
・呼び出したいコンパイラへのコマンドラインの記述はどのようなものか
について、挙げていただかないとイメージが伝わりません。
書き出すことができますか?


798) Re3:for文について(2つの変数の使用) YanaKen 2003/11/06(木) 14:55


KITさん、こんにちは。

 ぼくも皆さんと同様、質問の趣旨をいまいち把握し切れてないですが(ゆえにハズしているかもしれないのですが)、
「複数のディレクトリに対して連続的に処理を実行するためにFOR文を使いたい」
「さらに、処理対象となる各ディレクトリ内でのバッチ処理そのものにもFOR文を使用したい」
 ……と、つまり「入れ子にしたい」という場合の一般論としては、次のような文法になるかと思います。

(1)FOR文を2つ重ねる。
FOR %%I IN (A B C) DO FOR %%J IN (D E F) DO ECHO %1 %%I %%J %2 %3

(2)後段の処理を別のバッチファイルに分けて、FOR文から必要回数だけCALLする。
:MAIN.BAT
FOR %%I IN (A B C) DO CALL STEP2.BAT %%I %1 %2 %3
:STEP2.BAT
FOR %%J IN (D E F) DO ECHO %%J %1 %2 %3

SYSOP YanaKen


795) Re:for文について ふぇむ 2003/11/06(木) 11:26


>for文でワイルドカードを用いた変数を2つ使いたいのですがうまくできません。

>for /d %%a in (?-*) do del "%%a\*.lst"

>のようにワイルドカードを用いた変数を1つ使うことはできるのですが2つになると…。誰か使い方を知っておられる方、教えていただけないでしょうか。


先にNo.786に掲載したふぇむのサンプルスクリプトベースであれば、どうとでも拡張せきると思います。

あのスクリプトは、最初に対象のファイルリストをフルパスでリストアップしたファイルを作成し、次にその全件に対して処理をする、というように処理のブロックが分かれています。

なので、前半の処理ブロックでリストアップする部分を書き換えて、複数のワイルドカード指定でリストアップしたいものを1つのdir でまとめて拾ってもよいでしょうし、複数回 dir してリストファイルに追記してもよいでしょう。小技の枝葉で四苦八苦するより楽だと思います。




812) Re:具体的にいうと… KIT 2003/11/06(木) 18:26


具体的に説明してみます。

構成はカレントディレクトリの下に名前が
2-1-1や3-2-3等で始まる子ディレクトリが40ぐらいあります。

そして、各々の子ディレクトリの下に名前がm_で始まる
Cソースファイルが1つずつあります。
今回のコンパイル対象のファイルはこのファイルです。

これらを1つずつコンパイルをしていくのは手間がかかるので
バッチで一括コンパイルをしようと思い、以下のような内容の
バッチファイルを作りました。

for /d %%a in (?-*) do [コンパイルコマンド] -[オプション] %%a\main.rf %%a\m_*.c

しかし、これだと「m_*.c」の「*」がワイルドカードと認識されず、エラーが発生しました。ワイルドカードを使って、「m_」で始まるCソースファイルを指定するにはどうしたらいいのでしょうか?

解答、よろしくお願い致します。

815) Re2:具体的にいうと… ふぇむ 2003/11/06(木) 19:00


>構成はカレントディレクトリの下に名前が
>2-1-1や3-2-3等で始まる子ディレクトリが40ぐらいあります。
>そして、各々の子ディレクトリの下に名前がm_で始まる
>Cソースファイルが1つずつあります。
>今回のコンパイル対象のファイルはこのファイルです。

ちゃんと Makefile は上位に書いておいて、それを用いて make でコンパイルするとして、以下のような感じでどうでしょう。とりあえず *.o をつくる想定で書いてます。こんなんでよかったかなぁ...
また、動かしてないのでミスがあるかもですが....


@echo off
setlocal

set MAKEFILE=フルパスで共通Makefileを指定

for /f %%x in ( 'dir /b /s /a:d "?-*" ' ) do (
  call :DO_ABOUT_ONE_DIR "%%x"
)
  goto :end

:DO_ABOUT_ONE_DIR
  set __TARGET_DIR=%~1
  pushd "%__TARGET_DIR%"

  for %%z in ( m_*.c ) do (
    call :COMPILE_ONE_FILE %%~nz.o
  )
  popd
  goto :eof


:COMPILE_ONE_FILE
  set __TARGET_SRC=%~1
  make -f "%MAKEFILE%" %__TARGET_SRC%
  goto :eof


:end
endlocal



821) Re3:具体的にいうと… KIT 2003/11/07(金) 10:57


ふぇむさん、解答ありがとうございます。

少し手を加えましたが、コンパイルできるようになりました。

本当にありがとうございました。

817) Re2:具体的にいうと… YanaKen 2003/11/06(木) 19:09


KITさん

>しかし、これだと「m_*.c」の「*」がワイルドカードと認識されず、

 「認識されず」というよりは、「ワイルドカードそのものがコンパイラに渡されている」といったほうが正しいと思われます。
 for in (..) の()内に置かれているわけではない以上、そのワイルドカードがバッチファイル内で展開される必然性はないわけで、この書式だとたとえば、

compile -abc 2-1-1\m_*.c
compile -abc 3-1-1\m_*.c
compile -abc 4-1-1\m_*.c
compile -abc 5-1-1\m_*.c

 ……のようなコマンドが実行されることになります。で、コンパイラはコンパイルすべきファイル名をワイルドカードで渡されても動作できないためにエラーになってしまう、というわけですネ。

 急に発言が増えたので見落とされたのかもしれないですが(^^;、とりあえずぼくが798番にコメントしたやり方(forの多重化)で解決可能と思われます(他にも方法がありそうな気はしますが)。

 もう1度ご質問内容にあわせて書き換えれば、次のようになります。

for /d %%a in (?-*) do for %%b in (%%a\m_*.c) do [コンパイルコマンド] -[オプション] %%a\main.rf %%b

 こちらで動作チェックしたわけではありませんので、[コンパイルコマンド]の部分にechoコマンドをいれて、どういう文字列がコンパイラに渡されることになるかを事前にチェックされるとよいでしょう。

SYSOP YanaKen


820) Re3:具体的にいうと… KIT 2003/11/07(金) 09:42


>KITさん

>>しかし、これだと「m_*.c」の「*」がワイルドカードと認識されず、

> 「認識されず」というよりは、「ワイルドカードそのものがコンパイラに渡されている」といったほうが正しいと思われます。
> for in (..) の()内に置かれているわけではない以上、そのワイルドカードがバッチファイル内で展開される必然性はないわけで、この書式だとたとえば、

>compile -abc 2-1-1\m_*.c
>compile -abc 3-1-1\m_*.c
>compile -abc 4-1-1\m_*.c
>compile -abc 5-1-1\m_*.c

> ……のようなコマンドが実行されることになります。で、コンパイラはコンパイルすべきファイル名をワイルドカードで渡されても動作できないためにエラーになってしまう、というわけですネ。

> 急に発言が増えたので見落とされたのかもしれないですが(^^;、とりあえずぼくが798番にコメントしたやり方(forの多重化)で解決可能と思われます(他にも方法がありそうな気はしますが)。

> もう1度ご質問内容にあわせて書き換えれば、次のようになります。

>for /d %%a in (?-*) do for %%b in (%%a\m_*.c) do [コンパイルコマンド] -[オプション] %%a\main.rf %%b

> こちらで動作チェックしたわけではありませんので、[コンパイルコマンド]の部分にechoコマンドをいれて、どういう文字列がコンパイラに渡されることになるかを事前にチェックされるとよいでしょう。

SYSOP YanaKen


やり方としては

for /d %%a in (?-*) do for %%b in (%%a\m_*.c) do [コンパイルコマンド] -[オプション] %%a\main.rf %%b

とのことですがこのやり方は実は何回も試しましたが、できなかったです。いったいなぜなのでしょうか?もう、お手上げ状態です。なぜかわかる方、おられましたら教えてください。

よろしくお願い致します。

823) Re4:具体的にいうと… ふぇむ 2003/11/07(金) 12:25


>やり方としては

>for /d %%a in (?-*) do for %%b in (%%a\m_*.c) do [コンパイルコマンド] -[オプション] %%a\main.rf %%b

>とのことですがこのやり方は実は何回も試しましたが、できなかったです。いったいなぜなのでしょうか?もう、お手上げ状態です。なぜかわかる方、おられましたら教えてください。

実行時の現象(エラーが発生したのか、エラーは出ないけど思い通りに動かないだけなのか、エラーならどのようなエラーなのか)、動作に関わるディレクトリ 構造など環境に関すること、できればスクリプトの主要部分全体、など、第三者が全体をつかめるような情報がそろってないとなんともいえませんよ。


書かれたバッチについて、echo on 状態で

バッチ > ログ 2>&1

として実行し、ログファイルの中を見てみると、どのように処理が展開されたか、またどのようなコマンドを最終的に実行しようとしたのか、が見えるので、切り分けの手がかりになると思います。

実行コマンド行にリダイレクトがなければ、実行コマンドの先頭を echo として実際にコマンドが動かないようにして展開結果だけを見るのも有効です。バッチスクリプトだけ眺めて「こう動くはずだ」と推定を重ねても、思い込みや 誤解は解消しえません。展開されて実際に実行されてるコマンドをまず見てみるべきです。(複雑なバッチスクリプトになってくると、私はそのために引数でテ ストモードを設けて展開だけさせたりしてます)

とりあえず当面の問題は解決されたようですが、今後のためにも自分で一度検証されてみては如何でしょうか。

  • ◆792.  for文について (KIT)   2003/11/06(木) 10:27
    •  793.  Re:for文について (じゃく)   2003/11/06(木) 10:40
      •  794.  Re2:for文について (KIT)   2003/11/06(木) 10:50
        •  796.  Re3:for文について (ふぇむ)   2003/11/06(木) 11:34
        •  797.  Re3:for文について (じゃく)   2003/11/06(木) 13:58
        •  798.  Re3:for文について(2つの変数の使用) (YanaKen)   2003/11/06(木) 14:55
    •  795.  Re:for文について (ふぇむ)   2003/11/06(木) 11:26
    •  812.  Re:具体的にいうと… (KIT)   2003/11/06(木) 18:26
      •  815.  Re2:具体的にいうと… (ふぇむ)   2003/11/06(木) 19:00
        •  821.  Re3:具体的にいうと… (KIT)   2003/11/07(金) 10:57
      •  817.  Re2:具体的にいうと… (YanaKen)   2003/11/06(木) 19:09
        •  820.  Re3:具体的にいうと… (KIT)   2003/11/07(金) 09:42
          •  823.  Re4:具体的にいうと… (ふぇむ)   2003/11/07(金) 12:25
 
 


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

 

カテゴリー一覧

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


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

資料書籍

About

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

ひとつ前の投稿は「別のバッチファイルの呼び出しがうまくいかない」です。

次の投稿は「配布したファイルをデスクトップにコピーするバッチ処理」です。

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

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