Me gustaría saber cómo recorrer cada línea en un archivo de texto usando un archivo por lotes de Windows y procesar cada línea de texto en sucesión.
windows
batch-file
Señor kraus
fuente
fuente
%%A
con%A
el comando anterior. De lo contrario lo conseguirás%%A was unexpected at this time.
.for /F "tokens=*" %%A in ("myfile.txt") do echo A = %%A
->A = myfile.txt
. ¿Alguna idea de cómo frustrar esto?De la referencia de línea de comando de Windows:
Para analizar un archivo, ignorando las líneas comentadas, escriba:
Este comando analiza cada línea en Myfile.txt, ignorando las líneas que comienzan con un punto y coma y pasan el segundo y 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,% j para obtener el tercer token y% k para obtener todos los tokens restantes.
Si los nombres de archivo que proporciona contienen espacios, utilice 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, puede encontrar el archivo de ayuda de línea de comandos en la mayoría de los sistemas Windows en:
fuente
usebackq
" :for /f "usebackq" %%a in ("Z:\My Path Contains Spaces\xyz\abc.txt")
En un archivo por lotes DEBE usar en
%%
lugar de%
: (Tipohelp for
)Qué hace esto: El "do call: process %% i %% j %% k" al final del comando for pasa la información adquirida en el comando for desde myfile.txt a la "subrutina" del proceso.
Cuando usa el comando for en un programa por lotes, debe usar signos de% doble para las variables.
Las siguientes líneas pasan esas variables del comando for al proceso 'subrutina' y le permiten procesar esta información.
Tengo algunos usos bastante avanzados de esta configuración exacta que estaría dispuesto a compartir si se necesitan más ejemplos. Agregue su EOL o Delims según sea necesario, por supuesto.
fuente
Mejorando la primera respuesta "FOR / F ..": Lo que tuve que hacer fue llamar a ejecutar cada script que figura en MyList.txt, por lo que funcionó para mí:
O bien, si desea hacerlo a través de la línea múltiple:
Editar: El ejemplo anterior es para ejecutar el bucle FOR desde el símbolo del sistema; desde un script por lotes, se debe agregar un% adicional, como se muestra a continuación:
fuente
La respuesta de @ MrKraus es instructiva. Además, permítame agregar que si desea cargar un archivo ubicado en el mismo directorio que el archivo por lotes, prefije el nombre del archivo con% ~ dp0. Aquí hay un ejemplo:
NB:: si su nombre de archivo o directorio (por ejemplo, myfile.txt en el ejemplo anterior) tiene un espacio (por ejemplo, 'mi archivo.txt' o 'c: \ Archivos de programa'), use:
, con la palabra clave type que llama al
type
programa, que muestra el contenido de un archivo de texto. Si no desea sufrir la sobrecarga de llamar al comando de tipo, debe cambiar el directorio al directorio del archivo de texto. Tenga en cuenta que el tipo aún es necesario para los nombres de archivos con espacios.¡Espero que esto ayude a alguien!
fuente
**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óntype
walkaroundtype
evitar que funcione, tuve que citar mi nombre de archivo porque está en un directorio diferente que contiene espacios (MaldiciónProgram Files
). Recibo un errorThe system cannot find the file `type.
La respuesta aceptada es buena, pero tiene dos limitaciones.
Cae líneas vacías y líneas que comienzan con
;
Para leer líneas de cualquier contenido, necesita la técnica de alternancia de expansión retrasada.
Findstr se usa para prefijar cada línea con el número de línea y dos puntos, para que las líneas vacías ya no estén vacías.
DelayedExpansion debe deshabilitarse cuando se accede al
%%a
parámetro; de lo!
contrario^
, se perderán los signos de exclamación y las marcas , ya que tienen significados especiales en ese modo.Pero para eliminar el número de línea de la línea, la expansión demorada debe estar habilitada.
set "var=!var:*:=!"
elimina todo hasta el primer colon (el usodelims=:
eliminaría también todos los dos puntos al comienzo de una línea, no solo el de los hallazgos).El endlocal desactiva la expansión demorada nuevamente para la siguiente línea.
La única limitación es ahora el límite de longitud de línea de ~ 8191, pero parece que no hay forma de superar esto.
fuente
setlocal
en la línea de comandos. Cuando ejecuto código en CMD, obtengo! Var! en lugar de espacios en blanco. ¿Como arreglar?O puede excluir las opciones entre comillas:
fuente
Aquí hay un archivo bat que escribí para ejecutar todos los scripts SQL en una carpeta:
fuente
Si usted tiene un NT-familia Windows (uno con
cmd.exe
como la cáscara), tratar el comando for / F .fuente
La respuesta aceptada usando
cmd.exe
yfunciona solo para archivos "normales". Falla miserablemente con archivos enormes.
Para archivos grandes, puede que necesite usar Powershell y algo como esto:
o si tienes suficiente memoria:
Esto funcionó para mí con un archivo de 250 MB que contiene más de 2 millones de líneas, donde el
for /F ...
comando se atascó después de unos pocos miles de líneas.Para conocer las diferencias entre
foreach
yForEach-Object
, consulte Introducción a ForEach y ForEach-Object .(créditos: Leer archivo línea por línea en PowerShell )
fuente
Ejemplos modificados aquí para enumerar nuestras aplicaciones Rails en Heroku, ¡gracias!
Código completo aquí .
fuente
for /f "tokens=1" %%i in ('find /v "=" heroku_apps.txt ^| find /v ".TXT" ^| findstr /r /v /c:"^$"') do...
(^
tenga en cuenta la adición de 's utilizado para escapar de la tubería, para que se pase alfor
procesador de comandos y no directamente al procesador de comandos)Para imprimir todas las líneas en el archivo de texto desde la línea de comando (con expansión retardada):
Funciona con espacios en blanco iniciales, líneas en blanco, líneas de espacios en blanco.
Probado en Win 10 CMD
fuente
]]]
líneas de entrada, la segunda muestra suelta líneas vacías y líneas que comienzan con espaciodelims
si alguna línea en el archivo de texto comienza con,]
por ejemplo. reemplace con algún personaje que no lo haga, o un personaje de control como retroceso o campana; normalmente no se encuentran en archivos de texto. La razón dedelims=]
es eliminar los marcadores de posición creadas por/n
defind
comando para preservar las líneas en blanco.