Que tal isso?
for /f "tokens=* delims=" %%a in ('dir "c:\test\foo bar.txt" /s /b') do (
echo %%a
)
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"
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.
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"
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
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