QA@IT

Windowsのバッチでパス名の途中でのワイルドカードについて

10005 PV

複数フォルダ内のテキストファイルから、検索文字列を別のテキストファイルに出力したいと考えています。
以下ディレクトリのイメージです。

Test
 ├Folder1
 │  ├text1.txt
 │  └text2.txt
 ├Folder2
 │  ├text1.txt
 │  └text2.txt
 │
 └tmp.txt (出力用テキストファイル)

set tmp=C:\Users\(username)\Desktop\Test\tmp.txt
cd Test

for /d %%i in (Folder*) do (
 for %%j in (text*) do (
    findstr "apple" %%i\%%j >> %tmp%
) 

想定する処理としては、Folder1,Folder2のtext1.txt,text2.txt内に記入されている「apple」をtmp.txtに出力したいと考えています。

コードの内側のループは成功するのですが、外側のループでフォルダ名にワイルドカードを指定すると想定している処理になりません。

パス名の途中(フォルダ名)にワイルドカードを使用するfor文を教えていただきたいです。

回答

コマンドが、どこで実行されるか(カレント ディレクトリはどこか)を考えてみましょう。
最初に、「CD TEST」で TEST ディレクトリへ移動します。
そこで、「for /d %%i in (Folder*) do (」が実行されます。
ここで、「%i」は、[ "Folder1", "Folder2" ] が入ります。
そして、「for %%j in (text*) do (」が実行されます。このとき、カレント ディレクトリは?
TEST ディレクトリですよね。
ということで、何も見つかりません。
なので、「%%i\」をつけるところが間違っています。

編集 履歴 (0)
  • for文を以下の通りに修正したら、想定していた処理になりました!

    for /d %%i in (Folder*) do (
    for %%j in (%%i\text*.txt) do (
    findstr "apple" %%j >> %tmp%
    )
    )
    -
  • Jittaさんのご指摘いただいた通り、%jにいれるパスに誤りがありました。
    カレントディレクトリであるTestからtext*.txtのあるディレクトリまでのパスを%jに設定する必要があったのですね、、

    丁寧に解説していただいたお陰で解決できました。
    ありがとうございました!
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。