[Batch] Leer lineas de archivo y generar opciones

Iniciado por Shinseiki86, 27 Marzo 2009, 18:57 PM

0 Miembros y 1 Visitante están viendo este tema.

Shinseiki86

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.


[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

leogtz

Te pondre un ejemplo.

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



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 (dos) [Seleccionar]

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET /A CONTADOR=0
FOR /F "EOL= TOKENS=* DELIMS=" %%- IN (FILE.TXT) DO (
SET /A CONTADOR+=1
CALL SET LINEA!CONTADOR!=%%-
)
FOR /L %%_ IN (1 1 !CONTADOR!) DO (ECHO.%%_.-!LINEA%%_!)
:OPCION
SET /P "OPCION=TECLEE EL NUMERO DE LA OPCION DADA : "
IF NOT DEFINED OPCION (GOTO:OPCION)
IF %OPCION% GTR %CONTADOR% (GOTO:OPCION)
IF %OPCION% EQU 1 (START "" /B "%WINDIR%\NOTEPAD.EXE")
IF %OPCION% EQU 2 (START "" /B "%WINDIR%\SYSTEM32\CALC.EXE")
IF %OPCION% EQU 3 (START "" /B "%WINDIR%\REGEDIT.EXE")
EXIT /B 0


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


Saludos.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

0x0309

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.

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í:

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

leogtz

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

Codigo :
Código (dos) [Seleccionar]
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET /A CONTADOR=0
FOR /F "TOKENS=* DELIMS= EOL=" %%- IN (FILE.TXT) DO (
SET /A CONTADOR+=1
CALL SET LINEA!CONTADOR!=%%-
)
FOR /L %%_ IN (1 1 !CONTADOR!) DO (ECHO.%%_.-!LINEA%%_!)
:OPCION
SET /P "OPCION=TECLEE EL NUMERO DE LA OPCION DADA : "
IF NOT DEFINED OPCION (GOTO:OPCION)
IF %OPCION% GTR %CONTADOR% (GOTO:OPCION)
IF %OPCION% EQU 1 (START "" /B "%WINDIR%\NOTEPAD.EXE")
IF %OPCION% EQU 2 (START "" /B "%WINDIR%\SYSTEM32\CALC.EXE")
IF %OPCION% EQU 3 (START "" /B "%WINDIR%\REGEDIT.EXE")
EXIT /B 0


Saludos.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

0x0309

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

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

"TOKENS=* DELIMS= EOL="

aunque queda mejor con una limpieza de espacios al comienzo, en este caso.

Shinseiki86

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

set linea!count!=%%A
echo %linea!count!%


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

Shinseiki86

#6
Hasta ahora llevo el script así:


@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:
CitarO:\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

Shinseiki86

Hasta ahora llevo el codigo asi:


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?

Bulone

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:


@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.
No existen los caminos equivocados puesto que en este viaje no puedes dejar de ir hacia donde vas