In Windows eine Batchdatei mit einer rekursiven for-Schleife und einem Dateinamen einschließlich Leerzeichen

9

Ich habe einen Ordnerbaum wie diesen (es ist nur ein Beispiel, er wird in meinem realen Fall tiefer gehen):

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

Meine Dateien haben ein oder mehrere Leerzeichen im Namen und ich muss einen Befehl für sie ausführen, daher interessiere ich mich für foo bar.txt, aber nicht für foobar.txt.

Ich habe versucht (in einer Batch-Datei):

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

wo der Befehl ist der einfache echo.
Es funktioniert nicht, weil der Speicherplatz übersprungen wird und ich keine Ausgabe erhalte.

Das funktioniert, aber es ist nicht das, was ich brauche:

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

Es druckt:

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

Ich habe versucht, das Anführungszeichen (") zu verwenden, aber es funktioniert nicht:

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

Es funktioniert nicht, da das Anführungszeichen noch in der Ausgabe enthalten ist:

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

Antworten:

9

Wie wäre es damit?

for /f "tokens=* delims=" %%a in ('dir "c:\test\foo bar.txt" /s /b') do (
echo %%a
)
Craig H.
quelle
Gute Idee, die Rekursion in dir zu verschieben! Vielen Dank.
Alessandro Jacopson
2

Ohne den rekursiven Schalter können Sie FORdie Anführungszeichen nicht drucken:

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

Möglicherweise können Sie verschachtelte FORAnweisungen ausführen . Das Äußere würde den Verzeichnisbaum durchlaufen und das Innere wäre das obige.

Bis auf weiteres angehalten.
quelle
Hallo, danke für deine Antwort. Ich habe die Frage bearbeitet, der Baum kann tiefer sein als nur eine Ebene und deshalb brauche ich die rekursive für.
Alessandro Jacopson
2
@uvts_cvs: FOR /R %%d in (.) DO for %%f ...ist rekursiv, aber es müssten einige Dinge herausgearbeitet werden, damit es funktioniert. Möglicherweise müssen Sie beispielsweise eine verzögerte Erweiterung verwenden. SETLOCAL ENABLEDELAYEDEXPANSIONund !varname!usw.
Bis auf weiteres angehalten.
% ~ dpnf lässt die Dateierweiterung weg.
Dolmen
@dolmen: Tippfehler behoben.
Bis auf weiteres angehalten.
2

Vielleicht möchten Sie sich den Befehl forfiles ansehen.

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

'/ S' - Rekursion. Durchsuchen Sie alle Unterverzeichnisse

'/ M "* *"' - Dateimaske. Suchen Sie nur nach Dateien mit einem Leerzeichen im Namen.

'/ C "cmd / C echo @PATH"' - Befehl. Setzen Sie diesen Befehl für alle gefundenen Dateien ab.

Beispielausgabe:

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

Die Flagge fist diejenige, die Sie benötigen, um einen absoluten Dateinamen ohne Anführungszeichen zu erhalten (damit Sie bei Bedarf Anführungszeichen setzen können). Da dies jedoch mit dem von Ihnen gewählten Variablennamen in Konflikt steht, müssen Sie einen anderen verwenden:

for /r test %%i in ("foo bar.txt") do echo %%~fi
Dolmen
quelle
Das ist völlig falsch. Es gibt keinen Variablennamenkonflikt und Anführungszeichen werden mit dem angezeigten Befehl gedruckt.
Bis auf weiteres angehalten.
0

Danke, Dennis! Auch ich habe an einem fast identischen Problem gearbeitet. Ich wollte eine Bat-Datei, die ich in einem Eingabe-Parameter als Suchzeichenfolge für Dateinamen übergeben konnte - rekursiv über Verzeichnisse. Nur für den Fall, dass dies für jemand anderen hier nützlich ist.

::+++++++++
@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
skippyV
quelle