2008-10-01 16 views

Respuesta

231

Las publicaciones a continuación ayudaron mucho, pero no hicieron lo que dije en mi pregunta donde necesitaba procesar toda la línea como un todo. Esto es lo que encontré para trabajar.

for /F "tokens=*" %%A in (myfile.txt) do [process] %%A 

La palabra clave tokens con un asterisco (*) extraerá todo el texto de toda la línea. Si no coloca el asterisco, solo obtendrá la primera palabra en la línea. Supongo que tiene que ver con espacios.

For Command on TechNet

aprecio todos los mensajes!

+20

A adición menor: para hacer que esto funcione desde la línea de comando de forma interactiva, reemplace '%% A' con'% A' en el comando anterior. De lo contrario, obtendrás '%% A inesperado en este momento'. – vadipp

+14

FYI, si necesita hacer un comando de varias líneas, después de "DO" puede poner un paréntesis abierto "(" y unas líneas más tarde, finalícelo con un paréntesis de cierre ")" - y puede simplemente poner su bloque de código dentro de esos (sangrado a tus gustos). – BrainSlugs83

+0

Si tiene problemas con archivos en la misma carpeta con archivos por lotes anidados, o archivos que tienen espacios en sus nombres, consulte mi solución a continuación. –

48

A partir de la referencia de línea de comandos de Windows:

analizar un archivo, haciendo caso omiso de líneas de comentarios, escriba:

for /F "eol=; tokens=2,3* delims=," %i in (myfile.txt) do @echo %i %j %k 

Este comando lee cada línea en Miarchivo.txt, haciendo caso omiso de las líneas que comienzan con un punto y coma y pasar el segundo y el tercer token de cada línea al cuerpo FOR (los tokens están delimitados por comas o espacios). El cuerpo de la instrucción FOR hace referencia a% i para obtener el segundo token, a% j para obtener el tercer token y a% k para obtener todos los tokens restantes.

Si los nombres de archivo que proporciona contienen espacios, use comillas alrededor del texto (por ejemplo, "Nombre de archivo"). Para usar comillas, debe usar usebackq. De lo contrario, las comillas se interpretan como la definición de una cadena literal para analizar.

Por cierto, se puede encontrar el archivo de ayuda de línea de comandos en la mayoría de los sistemas Windows en:

"C:\WINDOWS\Help\ntcmds.chm" 
+2

Buena explicación. – djangofan

+6

para [aclarar] (http://ss64.com/nt/for_cmd.html) el _ "para usar comillas, debe usar' usebackq' "_:' para/f "usebackq" %% a in (" Z: \ Mi ruta contiene espacios \ xyz \ abc.txt ")' – drzaus

8

aquí hay un archivo del palo que escribí para ejecutar todas las secuencias de comandos SQL en una carpeta:

REM ****************************************************************** 
REM Runs all *.sql scripts sorted by filename in the current folder. 
REM To use integrated auth change -U <user> -P <password> to -E 
REM ****************************************************************** 

dir /B /O:n *.sql > RunSqlScripts.tmp 
for /F %%A in (RunSqlScripts.tmp) do osql -S (local) -d DEFAULT_DATABASE_NAME -U USERNAME_GOES_HERE -P PASSWORD_GOES_HERE -i %%A 
del RunSqlScripts.tmp 
+4

Omita el archivo temporal y simplemente use para/f %% A en ('dir/b/o: n * sql') do ... –

13

O bien, puede excluir las opciones entre comillas:

FOR /F %%i IN (myfile.txt) DO ECHO %%i 
+0

Obtengo el error: %% i inesperado en este momento –

+0

Dos signos de porcentaje uno al lado del otro %% se tratan como un solo signo de porcentaje en un comando (no en un archivo por lotes). – Paul

27

en un lote que Archivo MUST uso %% en lugar de %: (Tipo help for)

for /F "tokens=1,2,3" %%i in (myfile.txt) do call :process %%i %%j %%k 
goto thenextstep 
:process 
set VAR1=%1 
set VAR2=%2 
set VAR3=%3 
COMMANDS TO PROCESS INFORMATION 
goto :EOF 

Lo que esto hace: El "do call: process %% i %% j %% k" al final del comando for pasa la información adquirida en el comando for de myfile.txt al "proceso" 'subrutina'.

Cuando está utilizando el comando for en un programa por lotes, debe usar signos de doble% para las variables.

Las siguientes líneas pasan esas variables desde el comando para al proceso 'sub rutina' y le permiten procesar esta información.

set VAR1=%1 
set VAR2=%2 
set VAR3=%3 

que tienen algunos usos muy avanzadas de esta configuración exacta que yo estaría dispuesto a compartir si se necesitan más ejemplos. Agregue su EOL o Delims según sea necesario, por supuesto.

21

Mejora de la primera "A/F .." respuesta: Lo que tenía que hacer era llamar a ejecutar todos los guiones que figuran en MyList.txt, por lo que funcionó para mí:

for /F "tokens=*" %A in (MyList.txt) do CALL %A ARG1 

-OR , si desea hacerlo por varias líneas:

for /F "tokens=*" %A in (MuList.txt) do (
ECHO Processing %A.... 
CALL %A ARG1 
) 

Editar: el ejemplo anterior es para la ejecución del bucle FOR símbolo del sistema; de un lote-escritura, un% extra hay que añadir, como se muestra a continuación:

---START of MyScript.bat--- 
@echo off 
for /F "tokens=*" %%A in (MyList.TXT) do (
    ECHO Processing %%A.... 
    CALL %%A ARG1 
) 
@echo on 
;---END of MyScript.bat--- 
1

ejemplos Modded aquí para listar nuestras aplicaciones Rails en Heroku - gracias!

cmd /C "heroku list > heroku_apps.txt" 
find /v "=" heroku_apps.txt | find /v ".TXT" | findstr /r /v /c:"^$" > heroku_apps_list.txt 
for /F "tokens=1" %%i in (heroku_apps_list.txt) do heroku run bundle show rails --app %%i 

Código completo here.

+0

Por [comentario a otra pregunta más arriba] (http://stackoverflow.com/questions/155932/random-string-to-show-comment-highlighting#comment47265_155954) - Puede omitir la creación/lectura del archivo y simplemente usar 'para/f "tokens = 1" %% i in ('buscar/v' = "heroku_apps.txt^| find/v ".TXT"^| findstr/r/v/c: "^ $" ') do ... '(Observe la adición de'^'' s utilizada para escapar de la tubería, de modo que se pase al' for' y no directamente al procesador de comandos) – user66001

18

@ MrKraus's answer es instructivo. Además, permítame agregar que si desea cargar un archivo ubicado en el mismo directorio como archivo por lotes, prefija el nombre del archivo con% ~ dp0. Aquí está un ejemplo:

cd /d %~dp0 
for /F "tokens=*" %%A in (myfile.txt) do [process] %%A 

NB:: Si el nombre del archivo o directorio (por ejemplo miarchivo.txt en el ejemplo anterior) tiene un espacio (por ejemplo, 'mi archivo.txt' o 'c: \ Program archivos), utilice:

for /F "tokens=*" %%A in ('type "my file.txt"') do [process] %%A 

, con el tipo palabra clave llamando al programa type, que muestra el contenido de un archivo de texto. Si no quiere sufrir la sobrecarga de llamar al comando type, debe cambiar el directorio al directorio del archivo de texto. Tenga en cuenta que todavía se requiere el tipo para los nombres de archivos con espacios.

Espero que esto ayude a alguien!

+0

No hay necesidad de agregar un prefijo al nombre del archivo ya que el archivo por lotes se verá en la carpeta actual de forma predeterminada. – foxidrive

+0

@foxidrive: Bien, te escucho. Aunque se debe tener cuidado. Por ejemplo, si se cambió un directorio, se miraría en ese directorio en lugar de en el que está el archivo por lotes. La solución sería llamar a '** cd/d% ~ dp0 **' antes del ciclo for. Esto aseguraría que esté haciendo referencia a un archivo en el directorio en el que se encuentra el archivo por lotes. Gracias por la observación –

+2

Thx y +1 por el paseo tipo 'type' – halex

13

La respuesta aceptada es buena, pero tiene dos limitaciones.
cae líneas vacías y líneas que comienzan con ;

Para leer las líneas de cualquier contenido, lo que necesita la técnica de conmutación de expansión retardada.

@echo off 
SETLOCAL DisableDelayedExpansion 
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ text.txt"`) do (
    set "var=%%a" 
    SETLOCAL EnableDelayedExpansion 
    set "var=!var:*:=!" 
    echo(!var! 
    ENDLOCAL 
) 

Findstr se utiliza para prefijar cada línea con el número de línea y dos puntos, por lo que las líneas vacías no están vacíos más.

DelayedExpansion tiene que ser desactivado, al acceder al parámetro %%a, signos de admiración demás ! y signos de intercalación ^ se perderán, ya que tienen un significado especial en ese modo.

Pero para eliminar el número de línea de la línea, la expansión retrasada debe habilitarse.
set "var=!var:*:=!" elimina todo hasta los primeros dos puntos (utilizando delims=: eliminaría también todos los dos puntos al principio de una línea, no solo el de findstr).
endlocal desactiva la expansión retardada de nuevo para la siguiente línea.

La única limitación ahora es el límite de longitud de línea de ~ 8191, pero parece que no hay manera de superar esto.

Cuestiones relacionadas