7 votes

Batch : lire les lignes d'un fichier dont le chemin contient des espaces

Pour lire les lignes d'un fichier, dans un fichier batch, vous faites :

for /f %%a in (myfile.txt) do (
    :: do stuff...
)

Supposons maintenant que votre fichier se trouve dans C:\Program Files\myfolder

for /f %%a in ("C:\Program Files\myfolder\myfile.txt") do (
    echo %%a
)

Résultat :

C:\Program Files\myfolder\myfile.txt

Cela semble interpréter le chemin donné comme une chaîne de caractères, et donc %%a est le chemin qui vous est donné.

Rien à ce sujet dans la documentation que j'ai trouvée jusqu'à présent. S'il vous plaît, quelqu'un peut m'aider avant que je ne me tire une balle.

7voto

indiv Points 7403

La documentation que vous obtenez lorsque vous tapez help for vous indique ce qu'il faut faire si vous avez un chemin d'accès avec des espaces.

For file names that contain spaces, you need to quote the filenames with
double quotes.  In order to use double quotes in this manner, you also
need to use the usebackq option, otherwise the double quotes will be
interpreted as defining a literal string to parse.

Par défaut, la syntaxe de FOR /F est la suivante.

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

Cette syntaxe montre pourquoi votre type fonctionne. Parce que les guillemets simples indiquent qu'il faut exécuter la commande type et de passer en boucle sur sa sortie. Lorsque vous ajoutez la commande usebackq la syntaxe devient la suivante :

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ('string') DO command [command-parameters]
FOR /F ["options"] %variable IN (`command`) DO command [command-parameters]

Désormais, vous mettez les chemins d'accès aux fichiers entre guillemets, les chaînes de caractères littérales entre guillemets simples et les commandes à exécuter entre crochets (accents graves).

Vous voulez donc faire ceci :

for /f "usebackq" %%a in ("C:\Program Files\myfolder\myfile.txt") do (
    echo %%a
)

1voto

GhiOm Points 13732

Je l'ai trouvé.

for /f %%a in ('type "C:\Program Files\myfolder\myfile.txt"') do (
    echo Deleting: %%a
)

Ne me demandez même pas pourquoi cela fonctionne.

0voto

Prasanth M V Points 1

Je partage le code ci-dessous, en espérant que quelqu'un en bénéficiera.

Le code ci-dessous prend en compte à la fois le chemin ayant des espaces et les lignes lues ayant des espaces, il n'y aura pas de problème si les caractères après l'espace sont manquants ;

FOR /f "tokens=* delims=," %%a in ('type " C:\Progrem Fichier \My Program"') do ( echo %%a )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X