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

á

 


Tema destacado: Introducciˇn a Git (Primera Parte)


+  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 12,289 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