In Windows, un file batch con un ciclo ricorsivo per e un nome di file inclusi gli spazi


9

Ho un albero delle cartelle, come questo (è solo un esempio, sarà più profondo nel mio caso reale):

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

I miei file hanno uno o più spazi nel nome e ho bisogno di eseguire un comando su di essi, quindi sono interessato a foo bar.txt ma non a foobar.txt.

Ho provato (all'interno di un file batch):

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

dove il comando è il semplice echo.
Non funziona perché lo spazio viene ignorato e non ottengo alcun output.

Funziona ma non è quello di cui ho bisogno:

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

Stampa:

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

Ho provato a usare le virgolette (") ma non funziona:

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

Non funziona perché le virgolette sono ancora incluse nell'output:

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

Risposte:


9

Cosa ne pensi di questo?

for /f "tokens=* delims=" %%a in ('dir "c:\test\foo bar.txt" /s /b') do (
echo %%a
)

buona idea spostare la ricorsione in dir! Grazie.
Alessandro Jacopson,

2

Senza l'interruttore ricorsivo, puoi dire di FORnon stampare le virgolette:

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

Potresti essere in grado di fare FORistruzioni nidificate . L'esterno avrebbe camminato sull'albero delle directory e l'interno sarebbe quello sopra.


Ciao, grazie per la tua risposta. Ho modificato la domanda, l'albero può essere più profondo di un solo livello e quindi ho bisogno del ricorsivo per.
Alessandro Jacopson,

2
@uvts_cvs: FOR /R %%d in (.) DO for %%f ...è ricorsivo, ma ci sarebbero alcune cose da elaborare per farlo funzionare. Ad esempio, potrebbe essere necessario utilizzare l'espansione ritardata. SETLOCAL ENABLEDELAYEDEXPANSIONe !varname!, ecc.
In pausa fino a nuovo avviso.

% ~ dpnf ometterà l'estensione del file.
dolmen,

@dolmen: corretto l'errore di battitura.
In pausa fino a ulteriore avviso.

2

Potresti voler dare un'occhiata al comando forfiles.

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

'/ S' - Ricorsione. Cerca in tutte le sottodirectory

'/ M "* *"' - Maschera file. Cerca solo file con uno spazio nel loro nome.

'/ C "cmd / C echo @PATH"' - Comando. Emettere questo comando su tutti i file trovati.

Esempio di output:

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

0

Il flag fè quello che ti serve per ottenere un nome di file assoluto senza virgolette (quindi puoi mettere le virgolette in giro se necessario). Ma poiché è in conflitto con il nome della variabile che scegli, devi usarne un altro:

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

È completamente errato. Non ci sono conflitti di nomi di variabili e le virgolette vengono stampate dal comando che mostri.
In pausa fino a ulteriore avviso.

0

Grazie Dennis! Anch'io stavo lavorando su un problema quasi identico. Volevo un file bat che potessi passare in un parametro di input come stringa di ricerca per i nomi dei file, ricorsivamente attraverso le directory. Nel caso in cui questo sia utile a qualcun altro, eccolo qui.

::+++++++++
@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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.