Sous Windows, un fichier batch avec une boucle récursive et un nom de fichier comprenant des blancs

9

J'ai une arborescence de dossiers, comme celle-ci (ce n'est qu'un exemple, elle sera plus profonde dans mon cas réel):

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

Mes fichiers ont un ou plusieurs espaces dans le nom et je dois y exécuter une commande, donc je suis intéressé par foo bar.txt mais pas par foobar.txt.

J'ai essayé (dans un fichier batch):

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

où la commande est simple echo.
Cela ne fonctionne pas car l'espace est ignoré et je n'obtiens aucune sortie.

Cela fonctionne mais ce n'est pas ce dont j'ai besoin:

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

Il imprime:

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

J'ai essayé d'utiliser le guillemet (") mais cela ne fonctionne pas:

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

Cela ne fonctionne pas car le guillemet est toujours inclus dans la sortie:

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

Réponses:

9

Que dis-tu de ça?

for /f "tokens=* delims=" %%a in ('dir "c:\test\foo bar.txt" /s /b') do (
echo %%a
)
Craig H
la source
bonne idée de déplacer la récursivité en dir! Je vous remercie.
Alessandro Jacopson
2

Sans le commutateur récursif, vous pouvez dire de FORne pas imprimer les guillemets:

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

Vous pourrez peut-être faire des FORinstructions imbriquées . L'extérieur parcourrait l'arborescence des répertoires et l'intérieur serait celui ci-dessus.

En pause jusqu'à nouvel ordre.
la source
Bonjour, merci pour votre réponse. J'ai édité la question, l'arbre peut être plus profond qu'un seul niveau et j'ai donc besoin de récursif.
Alessandro Jacopson
2
@uvts_cvs: FOR /R %%d in (.) DO for %%f ...est récursif, mais il y aurait des choses à régler pour le faire fonctionner. Vous devrez peut-être utiliser une expansion retardée, par exemple. SETLOCAL ENABLEDELAYEDEXPANSIONet !varname!, etc.
pause jusqu'à nouvel ordre.
% ~ dpnf omettra l'extension du fichier.
dolmen
@dolmen: correction de la faute de frappe.
pause jusqu'à nouvel ordre.
2

Vous voudrez peut-être regarder la commande forfiles.

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

'/ S' - Récursivité. Rechercher dans tous les sous-répertoires

'/ M "* *"' - Masque de fichier. Recherchez uniquement les fichiers avec un espace dans leur nom.

'/ C "cmd / C echo @PATH"' - Commande. Exécutez cette commande sur tous les fichiers trouvés.

Exemple de sortie:

"C:\test\folder1\foo bar.txt"
"C:\test\folder2\foo bar.txt"
"C:\test\folder3\foo bar.txt"
Hurleur
la source
0

Le drapeau fest celui dont vous avez besoin pour obtenir un nom de fichier absolu sans guillemets (afin que vous puissiez mettre des guillemets si vous en avez besoin). Mais comme il entre en conflit avec le nom de variable que vous choisissez, vous devez en utiliser un autre:

for /r test %%i in ("foo bar.txt") do echo %%~fi
dolmen
la source
C'est complètement incorrect. Il n'y a pas de conflit de nom de variable et les guillemets sont imprimés par la commande que vous montrez.
pause jusqu'à nouvel ordre.
0

Merci Dennis! Moi aussi, je travaillais sur un problème presque identique. Je voulais un fichier bat que je pouvais passer dans un paramètre d'entrée comme chaîne de recherche pour les noms de fichiers - récursivement dans les répertoires. Juste au cas où cela serait utile à quelqu'un d'autre ici.

::+++++++++
@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
la source