En Windows, un archivo por lotes con un bucle recursivo para y un nombre de archivo que incluye espacios en blanco

9

Tengo un árbol de carpetas, como este (es solo un ejemplo, será más profundo en mi caso real):

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

Mis archivos tienen uno o más espacios en el nombre y necesito ejecutar un comando sobre ellos, así que estoy interesado en foo bar.txt pero no en foobar.txt.

Intenté (dentro de un archivo por lotes):

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

donde el comando es el simple echo.
No funciona porque se omite el espacio y no obtengo salida.

Esto funciona pero no es lo que necesito:

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

Imprime:

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

Intenté usar las comillas (") pero no funciona:

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

No funciona porque las comillas todavía se incluyen en la salida:

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

Respuestas:

9

¿Qué tal esto?

for /f "tokens=* delims=" %%a in ('dir "c:\test\foo bar.txt" /s /b') do (
echo %%a
)
Craig H
fuente
buena idea para mover la recursividad en dir! Gracias.
Alessandro Jacopson
2

Sin el interruptor recursivo, puede indicar que FORno imprima las comillas:

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

Es posible que pueda hacer FORdeclaraciones anidadas . Lo externo caminaría por el árbol del directorio y lo interno sería el de arriba.

Pausado hasta nuevo aviso.
fuente
Hola, gracias por tu respuesta. Edité la pregunta, el árbol puede ser más profundo que solo un nivel, por lo que necesito el recursivo.
Alessandro Jacopson
2
@uvts_cvs: FOR /R %%d in (.) DO for %%f ...es recursivo, pero habría algunas cosas que resolver para que funcione. Puede que tenga que usar la expansión retrasada, por ejemplo. SETLOCAL ENABLEDELAYEDEXPANSIONy !varname!, etc.
pausa hasta nuevo aviso.
% ~ dpnf omitirá la extensión del archivo.
dolmen
@dolmen: se corrigió el error tipográfico.
Pausado hasta nuevo aviso.
2

Es posible que desee ver el comando forfiles.

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

'/ S' - Recursión. Buscar en todos los subdirectorios

'/ M "* *"' - Máscara de archivo. Solo busque archivos con un espacio en su nombre.

'/ C "cmd / C echo @PATH"' - Comando. Emita este comando en todos los archivos encontrados.

Salida de ejemplo:

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

La bandera fes la que necesita para obtener un nombre de archivo absoluto sin comillas (para que pueda poner comillas si es necesario). Pero como entra en conflicto con el nombre de la variable que elige, debe usar otro:

for /r test %%i in ("foo bar.txt") do echo %%~fi
dolmen
fuente
Eso es completamente incorrecto. No hay conflicto de nombre de variable y las comillas se imprimen con el comando que muestra.
Pausado hasta nuevo aviso.
0

Gracias Dennis! Yo también estaba trabajando en un problema casi idéntico. Quería un archivo bat que pudiera pasar en un parm de entrada como una cadena de búsqueda de nombres de archivos, recursivamente a través de directorios. En caso de que esto sea útil para alguien más, aquí está.

::+++++++++
@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
fuente