elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  [Batch] Leer lineas de archivo y generar opciones
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Batch] Leer lineas de archivo y generar opciones  (Leído 15,026 veces)
Shinseiki86

Desconectado Desconectado

Mensajes: 33


Loading...


Ver Perfil
[Batch] Leer lineas de archivo y generar opciones
« en: 27 Marzo 2009, 18:57 pm »

Hola nuevamente a todos.

En un bat necesito mostrar en pantalla el contenido de un archivo txt (el cual contiene rutas de archivos). Luego dar la opción de seleccionar cual de estos archivos desea ver. La idea que se me ocurre es guardar cada linea del txt en una variable diferente, la cual está determinada por un contador. Pero no me funciona como espero. Coloco comentarios tipo C++ para explicar un poco lo que hice.

Código:
[pre]
:encontrados
set /A count=0
for /f "delims=\ tokens=1-6" %%A in (c:\temp.txt) do (
call:set
echo %count% ¯ %%D: %%F       //El contador se queda en cero
echo %rutacount%     //No se inicializó la variable para este ámbito?
set %rutacount%="%%A\%%B\%%C\%%D\%%E\%%F"
echo.
)
echo Termina el for
echo Ruta1: %ruta1%    //Existe, pero está vació
echo Ruta2: %ruta2%    //Existe, pero está vació
echo contador es %count%  //Ahora si muestra el contador en 2
pause
goto encontrados
...
...
:set
set /A count=count+1
set rutacount=ruta%count%
echo entro a countfor %count%
goto:EOF
[/pre]


Pero devuelve:
...
entro a countfor 1
0 » Simple: 2009-02-06_1_2254695_NI_805001157_EPS018_88_I.TXT
ECHO está desactivado.
La sintaxis del comando no es correcta.

entro a countfor 2
0 » Simple: 2009-03-05_1_2467997_NI_805001157_EPS018_88_I_2009-03.txt
ECHO está desactivado.
La sintaxis del comando no es correcta.

Termina el for
Ruta1:
Ruta2:
contador es 2
Presione una tecla para continuar . . .

**************************************
El contenido de c:\temp.txt es:

O:\X\X\Simple\X\2009-02-06_1_2254695_NI_805001157_EPS018_88_I.TXT
O:\X\X\Simple\X\2009-03-05_1_2467997_NI_805001157_EPS018_88_I_2009-03.txt

Gracias de antemano.

archivo bat completo:
http://es.geocities.com/dico916/b.bat.html


En línea

leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: [Batch] Leer lineas de archivo y generar opciones
« Respuesta #1 en: 29 Marzo 2009, 05:52 am »

Te pondre un ejemplo.

En mi disco C:\, tengo un archivo llamado "file.txt", que contiene lo siguiente:


Código:
Notepad.exe
Calc.exe
Regedit.exe
C:\>

El siguiente codigo lee el archivo de texto y cada linea la guarda en una variable, para luego ser usada en un menu:
Código
  1. @ECHO OFF
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. SET /A CONTADOR=0
  4. FOR /F "EOL= TOKENS=* DELIMS=" %%- IN (FILE.TXT) DO (
  5. SET /A CONTADOR+=1
  6. CALL SET LINEA!CONTADOR!=% style="color: #448888;">%-
  7. )
  8. FOR /L %%_ IN (1 1 !CONTADOR!) DO (ECHO.%%_.-!LINEA% style="color: #448888;">%_!)
  9. :OPCION
  10. SET /P "OPCION=TECLEE EL NUMERO DE LA OPCION DADA : "
  11. IF NOT DEFINED OPCION (GOTO:OPCION)
  12. IF %OPCION% GTR %CONTADOR% (GOTO:OPCION)
  13. IF %OPCION% EQU 1 (START "" /B "%WINDIR%\NOTEPAD.EXE")
  14. IF %OPCION% EQU 2 (START "" /B "%WINDIR%\SYSTEM32\CALC.EXE")
  15. IF %OPCION% EQU 3 (START "" /B "%WINDIR%\REGEDIT.EXE")
  16. EXIT /B 0

La salida :
Código:
1.-Notepad.exe
2.-Calc.exe
3.-Regedit.exe
TECLEE EL NUMERO DE LA OPCION DADA :

Saludos.


En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
0x0309

Desconectado Desconectado

Mensajes: 215


Ver Perfil
Re: [Batch] Leer lineas de archivo y generar opciones
« Respuesta #2 en: 29 Marzo 2009, 06:24 am »

Leo, esto no sé si te lo dije, pero el for /f tiene un bug con la opción eol, que debe ir al final, ya que si quieres sobreescribir su opción por defecto (;) el espacio entre el eol como separador de otra opción es considerado como el carácter espacio para eol y no como separador de opciones.

Código:
FOR /F "EOL= TOKENS=* DELIMS=" %%- IN (FILE.TXT) DO (

Si FILE.TXT tiene una línea que comienza con espacio será ignorada, por lo que esta línea debería ir así:

Código:
FOR /F "TOKENS=* DELIMS= EOL=" %%- IN (FILE.TXT) DO (
En línea

leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: [Batch] Leer lineas de archivo y generar opciones
« Respuesta #3 en: 29 Marzo 2009, 06:32 am »

Tienes razon, sino se especifica al final se toma como si se estableciera el caracter "espacio".

Codigo :
Código
  1. @ECHO OFF
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. SET /A CONTADOR=0
  4. FOR /F "TOKENS=* DELIMS= EOL=" %%- IN (FILE.TXT) DO (
  5. SET /A CONTADOR+=1
  6. CALL SET LINEA!CONTADOR!=% style="color: #448888;">%-
  7. )
  8. FOR /L %%_ IN (1 1 !CONTADOR!) DO (ECHO.%%_.-!LINEA% style="color: #448888;">%_!)
  9. :OPCION
  10. SET /P "OPCION=TECLEE EL NUMERO DE LA OPCION DADA : "
  11. IF NOT DEFINED OPCION (GOTO:OPCION)
  12. IF %OPCION% GTR %CONTADOR% (GOTO:OPCION)
  13. IF %OPCION% EQU 1 (START "" /B "%WINDIR%\NOTEPAD.EXE")
  14. IF %OPCION% EQU 2 (START "" /B "%WINDIR%\SYSTEM32\CALC.EXE")
  15. IF %OPCION% EQU 3 (START "" /B "%WINDIR%\REGEDIT.EXE")
  16. EXIT /B 0

Saludos.
« Última modificación: 29 Marzo 2009, 06:54 am por Leo Gutierrez. » En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
0x0309

Desconectado Desconectado

Mensajes: 215


Ver Perfil
Re: [Batch] Leer lineas de archivo y generar opciones
« Respuesta #4 en: 29 Marzo 2009, 06:38 am »

Código:
FOR /F "TOKENS=* EOL=" %%- IN (FILE.TXT) DO (
esas opciones realizan una limpieza de espacios al comienzo, por lo que líneas como estas:
Código:
          Texto
las tomará como:
Código:
Texto

Para que las tomé tal cual debe ser así:

Código:
"TOKENS=* DELIMS= EOL="

aunque queda mejor con una limpieza de espacios al comienzo, en este caso.
En línea

Shinseiki86

Desconectado Desconectado

Mensajes: 33


Loading...


Ver Perfil
Re: [Batch] Leer lineas de archivo y generar opciones
« Respuesta #5 en: 30 Marzo 2009, 17:55 pm »

El problema es que la lista guardada en el archivo C:\temp.txt se modifica constantemente. La lista puede ir de 1 linea a n lineas.

Por eso tuve la idea de crear una variable con consecutivo

Código:
set linea!count!=%%A
echo %linea!count!%

El problema es que al tratar de llamar la variable %linea!count!% no funciona.
En línea

Shinseiki86

Desconectado Desconectado

Mensajes: 33


Loading...


Ver Perfil
Re: [Batch] Leer lineas de archivo y generar opciones
« Respuesta #6 en: 30 Marzo 2009, 18:02 pm »

Hasta ahora llevo el script así:

Código:
@echo off
:encontrados

SetLocal EnableDelayEdexpansion
set /A count=0
echo on
for /f "delims=\ tokens=1-6" %%A in (c:\temp.txt) do (
set /A count+=1
echo !count! ¯ %%D: %%F
set ruta!count!="%%A\%%B\%%C\%%D\%%E\%%F"
echo %ruta!count!%
)

echo.
echo Ingrese consecutivo planilla que desea ver: count = %count%

set /p opc="> "
set opc=%opc: =_%
if %opc%==n goto main
if %opc%==x goto fin
::if not defined opc (goto encontrados)

if %opc% GEQ 1 (
if %opc% LEQ %count% (
::COMO HAGO PARA QUE ABRA EL ARCHIVO SELECCIONADO?
)
)
EndLocal
goto encontrados

En estos momentos en el archivo temp.txt hay:
Citar
O:\2009\03-Marzo\Asocajas\2009-03-02\2009-03-02_1_1190280_CC_10239342_EPS018_86_I_2009-03.TXT
O:\2009\03-Marzo\Simple\2009-03-25\2009-03-25_2_8826116295_CC_16653094_EPS018_88_I_2009-03.txt
O:\2009\02-Febrero\Asocajas\2009-02-02\2009-02-02_13572_NI_860013816_EPS018_83_IP.txt
« Última modificación: 30 Marzo 2009, 18:04 pm por Shinseiki86 » En línea

Shinseiki86

Desconectado Desconectado

Mensajes: 33


Loading...


Ver Perfil
Re: [Batch] Leer lineas de archivo y generar opciones
« Respuesta #7 en: 2 Abril 2009, 14:27 pm »

Hasta ahora llevo el codigo asi:

Código:
echo   Se han encontrado las siguientes planillas:
echo.
echo  ÉÍÍÍÍÍÍËÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
echo  º CONS º                            PLANILLA                            º
echo  ÌÍÍÍÍÍÍÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹
SetLocal EnableDelayEdexpansion
set /A count=0
for /f "delims=\ tokens=1-6" %%A in ('findstr /R /I /C:"_%planilla%_" O:\%anno%\list_busqueda\%mes%.txt') do (
set /A count+=1
echo  º   !count!  º  %%F
echo  ÌÍÍÍÍÍÍÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
set ruta!count!="%%A\%%B\%%C\%%D\%%E\%%F"
)

if not defined ruta1 (
echo   Planilla %planilla% no existe o la lista de busqueda no esta actualizada
echo.
pause
goto main
)
echo.
echo   Ingrese consecutivo planilla que desea ver:
echo   n = nueva busqueda   x = salir
set /p opc="> "
if not defined opc (goto encontrados)
set opc=%opc: =_%
if %opc%==n (
EndLocal
goto main
)
if %opc%==N (
EndLocal
goto main
)
if %opc%==x goto exit
if %opc%==X goto exit
if %opc% GEQ 1 (
if %opc% LEQ %count% (
call:open
)
)
EndLocal
goto encontrados

:open
if %opc%==1 if defined ruta1 start C:\Notepad++\notepad++5.3.1.exe %ruta1%
if %opc%==2 if defined ruta2 start C:\Notepad++\notepad++5.3.1.exe %ruta2%
if %opc%==3 if defined ruta3 start C:\Notepad++\notepad++5.3.1.exe %ruta3%
if %opc%==4 if defined ruta4 start C:\Notepad++\notepad++5.3.1.exe %ruta4%
if %opc%==5 if defined ruta5 start C:\Notepad++\notepad++5.3.1.exe %ruta5%
if %opc%==6 if defined ruta6 start C:\Notepad++\notepad++5.3.1.exe %ruta6%
if %opc%==7 if defined ruta7 start C:\Notepad++\notepad++5.3.1.exe %ruta7%
if %opc%==8 if defined ruta8 start C:\Notepad++\notepad++5.3.1.exe %ruta8%
if %opc%==9 if defined ruta9 start C:\Notepad++\notepad++5.3.1.exe %ruta9%
if %opc%==10 if defined ruta10 start C:\Notepad++\notepad++5.3.1.exe %ruta10%
goto:EOF

Pero solo funciona hasta ruta10 (osea 10 archivos encontrados. ¿No es posible hacerlo con recursion y/o un contador?
En línea

Bulone

Desconectado Desconectado

Mensajes: 16


Aquí dentro tengo paz pero hay fuera de dar guerra


Ver Perfil
Re: [Batch] Leer lineas de archivo y generar opciones
« Respuesta #8 en: 4 Abril 2013, 12:35 pm »

Este tema ya está super obsoleto, pero buscando información, me he visto por aquí, y me he decidido a dar una solución al tema que se quedó sin una buena solución:

Código:
@echo off

:inicio
set contador=0
for /f "tokens=*" %%a in (FILE.TXT) do set var1=%%a&call :a
set contador=0

set /p menu=Que numero de archivo deseas ver?:
for /f "tokens=*" %%b in (FILE.TXT) do set var2=%%b&call :b
goto incio

:a
set /a contador+=1
echo.%contador% .- %var1%
goto :eof

:b
set /a contador+=1
if %menu%==%contador% start %var2%
goto :eof

Si hay alguna duda, no dudéis en comentar.
En línea

No existen los caminos equivocados puesto que en este viaje no puedes dejar de ir hacia donde vas
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines