2010-12-08 849 views
6

para leer líneas de un archivo, en un archivo por lotes, lo hace:lotes: leer líneas de un archivo que tiene espacios en su camino

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

Ahora supongamos que usted presente es en C:\Program Files\myfolder

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

Resultado:

C:\Program Files\myfolder\myfile.txt 

Esto parece interpretar la ruta dada como una cadena, por lo que %%a s tu camino dado.

Nada sobre esto en la documentación que he encontrado hasta ahora. Por favor, alguien me ayude antes de dispararme.

+1

Hasta que alguien se le ocurre con una mejor respuesta, COPIE "C: \ Program Files \ myfolder \ myfile.txt" temp.txt, su bucle for, luego DEL temp.txt –

+0

@Gilbert: esperando que no sea un archivo llamado "my file.txt" .. – glmxndr

Respuesta

6

La documentación que obtiene cuando escribe help for le dice qué hacer si tiene una ruta con espacios.

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. 

Por defecto, la sintaxis de FOR /F es la siguiente.

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] 

Esta sintaxis muestra por qué funciona su type solución. Porque las comillas simples dicen que se ejecuta el comando type y se repite su salida. Cuando se agrega la opción usebackq, los cambios de sintaxis para esto:

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] 

Ahora usted dobles comillas caminos a los archivos,-comillas simples cadenas literales, y poner acentos abiertos (acento grave) en torno a los comandos a ejecutar.

Así que quieres hacer esto:

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

Me perdí esa parte de la documentación. Gracias ! – glmxndr

1

Lo encontraste.

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

Ni siquiera me preguntes por qué funciona.

+0

Porque TYPE muestra un archivo de texto. Su bucle FOR está procesando la cadena que representa el contenido del archivo de myfile.txt. Buen descubrimiento. –

+0

Sí, pero funciona con "for/f", que debe ser para leer archivos. Hubiera esperado que trabajara con "for" sin/f ... y no funciona. De todos modos ... No me pegué un tiro, eso es lo más importante. – glmxndr

0

Sólo compartir el código de abajo, con la esperanza de que alguien va a obtener beneficiado.

El código siguiente toma tanto la ruta que tiene espacios como si las líneas de lectura tienen espacios, no causará ningún problema de los caracteres cuando falta espacio;

para f/"tokens = * delims =" %% a la introducción ('Tipo "C: \ Progrem Archivo \ Mi Programa"') hacer ( echo %% a )

Cuestiones relacionadas