2010-12-08 19 views
6

Pour lire les lignes d'un fichier, dans un fichier batch, vous:lot: lire les lignes d'un fichier comportant des espaces dans son chemin

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

Supposons maintenant le fichier que vous est 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, et donc %%a i s votre chemin donné.

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

+1

Jusqu'à ce que quelqu'un arrive avec une meilleure réponse, copiez "C: \ Program Files \ monfolder \ monfichier.txt" temp.txt, votre boucle for, puis DEL temp.txt –

+0

@ Gilbert: en espérant que ce n'est pas un fichier nommé "mon fichier.txt" .. – glmxndr

Répondre

6

La documentation que vous obtenez lorsque vous tapez help for vous indique quoi faire si vous avez un chemin 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 le suivant.

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 solution fonctionne. Parce que les guillemets simples disent d'exécuter la commande type et boucle sur sa sortie. Lorsque vous ajoutez l'option usebackq, les modifications de syntaxe à ceci:

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] 

Maintenant vous doublez chemins de citation des fichiers, des chaînes guillemets simples littérales, et mettre des accents graves (accents graves) autour des commandes à exécuter.

Donc, vous voulez faire:

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

J'ai raté cette partie de la documentation. Merci ! – glmxndr

1

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.

+0

Parce que TYPE affiche un fichier texte. Votre boucle FOR traite la chaîne qui représente le contenu du fichier myfile.txt. Bonne recherche. –

+0

Oui, mais cela fonctionne avec "for/f" qui est censé être pour la lecture de fichiers. Je me serais attendu à ce que cela fonctionne avec "pour" sans/f ... et ce n'est pas le cas. De toute façon ... Je ne me suis pas tiré dessus, c'est le plus important. – glmxndr

0

partage juste le code ci-dessous, dans l'espoir que quelqu'un va se bénéficier.

Le code ci-dessous prend à la fois le chemin ayant des espaces et aussi si les lignes de lecture ont des espaces, il ne causera pas de problème de caractères après l'espace est manquant;

POUR/f "jetons = * = delims," ​​%% un dans ('type "C: \ Progrem fichier \ Mon programme"') faire ( écho %% un )