No Windows, um arquivo em lotes com um loop for recursivo 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, por isso estou interessado em foo bar.txt, mas não em foobar.txt.

Eu tentei (dentro de um arquivo em lotes):

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

onde o comando é simples echo.
Não funciona porque o espaço foi 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"
Alessandro Jacopson
fonte

Respostas:

9

Que tal agora?

for /f "tokens=* delims=" %%a in ('dir "c:\test\foo bar.txt" /s /b') do (
echo %%a
)
Craig H
fonte
boa idéia para mover a recursão em dir! Obrigado.
Alessandro Jacopson 14/03
2

Sem a opção recursiva, você pode dizer FORpara não imprimir as aspas:

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

Você pode conseguir FORinstruções aninhadas . O externo percorreria a árvore de diretórios e o interno seria o acima.

Pausado até novo aviso.
fonte
Olá, obrigado pela sua resposta. Eu editei a pergunta, a árvore pode ser mais profunda do que apenas um nível e, portanto, preciso da recursiva.
Alessandro Jacopson 11/03/11
2
@uvts_cvs: FOR /R %%d in (.) DO for %%f ...é recursivo, mas haveria algumas coisas para resolver para fazê-lo funcionar. Pode ser necessário usar a expansão atrasada, por exemplo. SETLOCAL ENABLEDELAYEDEXPANSIONe !varname!etc.
Pausado até novo aviso.
% ~ dpnf omitirá a extensão do arquivo.
dólmen
@ dolmen: Corrigido o erro de digitação.
Pausado até novo aviso.
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. Procure apenas arquivos com um espaço em seu nome.

'/ 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"
Furo
fonte
0

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

for /r test %%i in ("foo bar.txt") do echo %%~fi
dolmen
fonte
Isso é completamente incorreto. Não há conflito de nome de variável e as aspas são impressas pelo comando que você mostra.
Pausado até novo aviso.
0

Obrigado, Dennis! Eu também estava trabalhando em um problema quase idêntico. Eu queria um arquivo bat que pudesse passar em uma entrada parm como uma sequência de pesquisa para nomes de arquivos - recursivamente através de diretórios. Caso isso seja útil para outra pessoa, aqui 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
fonte