run - windows batch file virus
¿Cómo recorres cada línea en un archivo de texto usando un archivo por lotes de Windows? (11)
Aquí hay un archivo bat que escribí para ejecutar todos los scripts 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
Me gustaría saber cómo recorrer cada línea en un archivo de texto utilizando un archivo por lotes de Windows y procesar cada línea de texto en sucesión.
Desde la referencia de la línea de comandos de Windows:
Para analizar un archivo, ignorando las líneas comentadas, escriba:
for /F "eol=; tokens=2,3* delims=," %i in (myfile.txt) do @echo %i %j %k
Este comando analiza cada línea en Myfile.txt, ignorando las líneas que comienzan con un punto y coma y pasando 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, 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, puede encontrar el archivo de ayuda de la línea de comandos en la mayoría de los sistemas Windows en:
"C:/WINDOWS/Help/ntcmds.chm"
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 .
En un archivo por lotes, DEBE usar %%
lugar de %
: (escriba 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
Qué hace esto: el "do call: process %% i %% j %% k" al final del comando for pasa la información adquirida en el comando for de myfile.txt a la "subrutina" del proceso.
Cuando está utilizando el comando for en un programa por lotes, necesita usar signos de% doble para las variables.
Las siguientes líneas pasan esas variables desde el comando for a la ''sub rutina'' del proceso y le permiten procesar esta información.
set VAR1=%1
set VAR2=%2
set VAR3=%3
Tengo algunos usos bastante avanzados de esta configuración exacta que estaría dispuesto a compartir si se necesitaran más ejemplos. Agregue su EOL o Delims según sea necesario, por supuesto.
La answer de @KrKraus 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:
cd /d %~dp0
for /F "tokens=*" %%A in (myfile.txt) do [process] %%A
NB:: si su nombre de archivo o directorio (por ejemplo, myfile.txt en el ejemplo anterior) tiene un espacio (por ejemplo, ''my file.txt'' o ''c: / Archivos de programa''), use:
for /F "tokens=*" %%A in (''type "my file.txt"'') do [process] %%A
, con la palabra clave de tipo que llama al programa de type
, 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 todavía se requiere el tipo para los nombres de archivo con espacios.
¡Espero que esto ayude a alguien!
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, necesita la expansión demorada técnica de conmutación.
@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 ya no están vacías.
La Expansión demorada debe estar deshabilitada cuando se accede al parámetro %%a
, de lo contrario, !
signos de exclamación !
y los carets se perderán, ya que tienen significados especiales 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 el primer colon (utilizando delims=:
eliminaría también todos los dos puntos al principio de una línea, no solo el de findstr).
El endlocal desactiva la expansión retrasada de nuevo 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.
La respuesta aceptada usando cmd.exe
y
for /F "tokens=*" %F in (file.txt) do whatever "%F" ...
Funciona solo para archivos "normales". Falla miserablemente con archivos enormes.
Para archivos grandes, es posible que necesites usar Powershell y algo como esto:
[IO.File]::ReadLines("file.txt") | ForEach-Object { whatever "$_" }
o si tienes suficiente memoria:
foreach($line in [System.IO.File]::ReadLines("file.txt")) { whatever "$line" }
Esto me funcionó con un archivo de 250 MB que contiene más de 2 millones de líneas, donde el comando for /F ...
se atascó después de unos pocos miles de líneas.
Para conocer las diferencias entre foreach
y ForEach-Object
, consulte Introducción a ForEach y ForEach-Object .
(créditos: Leer archivo línea por línea en PowerShell )
Las publicaciones a continuación ayudaron enormemente, pero no hicieron lo que dije en mi pregunta donde necesitaba procesar toda la línea en su totalidad. 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 tirará de la primera palabra en la línea. Supongo que tiene que ver con espacios.
¡Aprecio todos los mensajes!
Si hay espacios en su ruta de archivo, necesita usar usebackq
. Por ejemplo.
for /F "usebackq tokens=*" %%A in ("my file.txt") do [process] %%A
Mejora de la primera respuesta "FOR / F ..": Lo que tenía que hacer era ejecutar la ejecución de todos los scripts listados en MyList.txt, así que funcionó para mí
for /F "tokens=*" %A in (MyList.txt) do CALL %A ARG1
--Oh, si desea hacerlo sobre la línea múltiple:
for /F "tokens=*" %A in (MuList.txt) do (
ECHO Processing %A....
CALL %A ARG1
)
Edición: el ejemplo dado anteriormente es para ejecutar el bucle FOR desde el símbolo del sistema; de un script por lotes, se debe agregar un% adicional, 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---
O bien, puede excluir las opciones entre comillas:
FOR /F %%i IN (myfile.txt) DO ECHO %%i
Si tiene un Windows de la familia NT (uno con cmd.exe
como shell), pruebe el comando FOR / F.