Windowsでは、再帰的なforループと空白を含むファイル名を含むバッチファイル


9

次のようなフォルダーツリーがあります(これは単なる例であり、実際のケースではより深くなります)。

C:\test
|   
+---folder1
|       foo bar.txt
|       foobar.txt
|       
+---folder2
|       foo bar.txt
|       foobar.txt
|       
\---folder3
        foo bar.txt
        foobar.txt

ファイルの名前に1つ以上のスペースがあり、それらに対してコマンドを実行する必要があるため、foo bar.txtには興味がありますが、foobar.txtには興味がありません。

私は試しました(バッチファイルの中で):

for /r test %%f in (foo bar.txt) do if exist %%f echo %%f

コマンドは単純echoです。
スペースがスキップされて出力が得られないため、機能しません。

これは機能しますが、私が必要とするものではありません:

for /r test %%f in (foobar.txt) do if exist %%f echo %%f

それは印刷します:

C:\test\folder1\foobar.txt
C:\test\folder2\foobar.txt
C:\test\folder3\foobar.txt

引用符( ")を使用しようとしましたが、機能しません。

for /r test %%f in ("foo bar.txt") do if exist %%f echo %%f

引用符が出力に含まれているため、機能しません。

C:\test\folder1\"foo bar.txt"
C:\test\folder2\"foo bar.txt"
C:\test\folder3\"foo bar.txt"

回答:



2

再帰的なスイッチがFORない場合、引用符を印刷しないように指示できます。

for %%f in ("foo bar.txt") do @if exist %%f echo %~dpnxf

ネストされたFORステートメントを実行できる場合があります。外側はディレクトリツリーを歩き、内側は上のツリーを歩きます。


こんにちは、お返事ありがとうございます。質問を編集しました。ツリーは1レベルだけよりも深くなる可能性があるため、再帰が必要です。
アレッサンドロジャコプソン

2
@uvts_cvs:FOR /R %%d in (.) DO for %%f ...再帰的ですが、機能させるために解決する必要があることがいくつかあります。たとえば、遅延拡張を使用する必要がある場合があります。SETLOCAL ENABLEDELAYEDEXPANSIONそして!varname!、など
追って通知があるまで一時停止しました。

%〜dpnfはファイル拡張子を省略します。
ドルメン

@dolmen:タイプミスを修正しました。
追って通知があるまで一時停止。

2

forfilesコマンドを確認することをお勧めします。

forfiles /S /M "* *" /C "cmd /C echo @PATH"

'/ S'-再帰。すべてのサブディレクトリを検索

'/ M "* *"'-ファイルマスク。名前にスペースが含まれるファイルのみを検索します。

'/ C "cmd / C echo @PATH"'-コマンド。見つかったすべてのファイルに対してこのコマンドを発行します。

出力例:

"C:\test\folder1\foo bar.txt"
"C:\test\folder2\foo bar.txt"
"C:\test\folder3\foo bar.txt"

0

フラグfは、引用符なしで絶対ファイル名を取得するために必要なものです(必要な場合は引用符で囲むことができます)。ただし、選択した変数名と競合するため、別の変数名を使用する必要があります。

for /r test %%i in ("foo bar.txt") do echo %%~fi

それは完全に間違っています。変数名の競合はなく、引用符は表示したコマンドによって出力されます。
追って通知があるまで一時停止。

0

ありがとう、デニス!私もほとんど同じ問題に取り組んでいました。ファイル名の検索文字列として入力パラメーターに渡すことができるbatファイルが必要でした-再帰的にディレクトリを介して。これが他の誰かに役立つ場合に備えて、それはここです。

::+++++++++
@echo off
setlocal ENABLEDELAYEDEXPANSION
for /R %%d in (.) do (
   for /f "usebackq" %%i in (`dir /b %%d ^| findstr /i %1`) do (
      echo Processing %%i
   )
)
endlocal
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.