No Windows, um arquivo de lote com um loop recursivo para e um nome de arquivo incluindo espaços em branco

9

Eu tenho uma árvore de pastas, como esta (é apenas um exemplo, será mais profundo no meu caso real):

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

Meus arquivos têm um ou mais espaços no nome e eu preciso executar um comando neles, então estou interessado em foo bar.txt, mas não no foobar.txt.

Eu tentei (dentro de um arquivo de lote):

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

em que o comando é o simples echo .
Não funciona porque o espaço é ignorado e não recebo saída.

Isso funciona, mas não é o que eu preciso:

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

Eu tentei usar as aspas ("), mas não funciona:

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

Não funciona porque as aspas ainda estão incluídas na saída:

C:\test\folder1\"foo bar.txt"
C:\test\folder2\"foo bar.txt"
C:\test\folder3\"foo bar.txt"
    
por Alessandro Jacopson 11.03.2011 / 15:33

5 respostas

9

Que tal isso?

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

Sem a opção recursiva, você pode informar FOR para não imprimir as aspas:

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

Você pode fazer instruções FOR aninhadas. O exterior percorreria a árvore de diretórios e o interno seria o acima.

    
por 11.03.2011 / 16:42
2

Você pode querer olhar para o comando forfiles.

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

'/ S' - Recursão. Pesquisar todos os subdiretórios

'/ M "* *"' - Máscara de arquivo. Pesquise apenas arquivos com um espaço no nome deles.

'/ C "cmd / C echo @PATH"' - Comando. Emita este comando em todos os arquivos encontrados.

Exemplo de saída:

"C:\test\folder1\foo bar.txt"
"C:\test\folder2\foo bar.txt"
"C:\test\folder3\foo bar.txt"
    
por 10.05.2011 / 15:43
0

O sinalizador f é o que você precisa para obter um nome de arquivo absoluto sem aspas (para que você possa colocar aspas se precisar). Mas como está em conflito com o nome da variável que você escolhe, você precisa usar outro:

for /r test %%i in ("foo bar.txt") do echo %%~fi
    
por 27.03.2011 / 12:21
0

Obrigado, Dennis! Eu também estava trabalhando em um problema quase idêntico. Eu queria um arquivo bat que eu pudesse passar em uma entrada parm como uma string de busca para nomes de arquivos - recursivamente através de diretórios. Apenas no caso de isso ser útil para alguém aqui, é.

::+++++++++
@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
    
por 31.03.2011 / 19:53

Tags