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

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ayuda programacion batch: uso del for /f
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ayuda programacion batch: uso del for /f  (Leído 5,548 veces)
juntacadaveres

Desconectado Desconectado

Mensajes: 76



Ver Perfil
ayuda programacion batch: uso del for /f
« en: 3 Abril 2019, 22:31 pm »

me han mandado el siguiente ejercicio:

Crea un fichero batch que muestre el siguiente menú
BUSQUEDA DE REGISTROS
1.- Nombre
2.- Apellido
3.- Teléfono
4.- Salir
La opción 1 pedirá un valor. Buscará en el fichero AGENDA.TXT, en el campo nombre
cualquier registro que contenga la cadena especificada. Ejemplo: si busco BE, localizará los
registros BERTA, ALBERTO, ABELARDO… Por cada registro encontrado mostrará:
Nombre
NOMBRE
Apellido
APELLIDO
Teléfono
TELEFONO
Los diferentes registros se separarán por una línea de guiones.
La opción 2 y 3 funcionan de forma similar.
La opción 4 vacía las variables y sale del programa.


el contenido del fichero es el siguiente:


jose:morales:41254
bob:dylan:124544
pepito:jimenez:6651454
susana:ochoa:124454
guillermo:paredes:4575
susel:roca:21145
tomas:palermo:4544


y mi codigo es el siguiente:


Código:
@echo off
rem ejercicio 9
setlocal enabledelayedexpansion
:menu
set nomb=
cls
echo -------------------------
echo - BUSQUEDA DE REGISTROS -
echo -------------------------
echo.
echo 1. Nombre
echo 2. Apellido
echo 3. Telefono
echo 4. Salir
echo.
:opt
set opt=
set /p opt="Selecciona una opcion: "
if /i "%opt%"=="1" goto opt1
if /i "%opt%"=="2" goto opt2
if /i "%opt%"=="3" goto opt3
if /i "%opt%"=="4" goto opt4
echo la opcion no es valida
pause>nul
goto menu
:opt1
set /p nomb="Buscar campo nombre: "

for /F "tokens=1,2,3 delims=:" %%a in (agenda.txt) do (
    echo %%a %%b %%c | find "%nomb%"
)
pause>nul
goto menu
:fin

obviamente solo esta hecho hasta la primera parte
pero mi problema es que no funciona tal como me lo piden

ya que el resultado seria

NOMBRE:APELLIDO:TELEFONO
y a mi me lo piden de otra manera

nombre
NOMBRE
apellido
APELLIDO
telefono
TELEFONO

no sé como extraer el %%b ni el %%c en otro echo ya que ya no es posible usar el

Código:
|echo %%b find %nomb% 

ya que ni en el segundo token ni en el tercero no hay nada que coincida con %nomb%
no se como hacerlo.... necesito ayuda, por favor


« Última modificación: 3 Abril 2019, 22:34 pm por juntacadaveres » En línea

srWhiteSkull


Desconectado Desconectado

Mensajes: 444



Ver Perfil WWW
Re: ayuda programacion batch: uso del for /f
« Respuesta #1 en: 4 Abril 2019, 01:05 am »

La verdad es que es una tontería, vas por buen camino pero te diré:

Código
  1. ...
  2. for /F "tokens=1,2,3 delims=:" %%a in (agenda.txt) do (
  3.    echo %%a %%b %%c | find "%nomb%"
  4. )
  5. ...

Por medio de ésto estás extrayendo las tres columnas de cada fila (%%a, %%b y %%c), y el find al encontrar en alguna de éstas filas una cadena que sea igual a la que tengas en %nomb% la imprime. Bien, entonces, ésto no es correcto para lo que te pide el ejercicio pero no vas mal encaminado, porque si tuvieras un nombre en apellidos o si pusiéramos de nombre "roca", nos mostraría los datos de "susel", y no debería mostrar nada, ya que "roca" es el apellido. Vale, entonces lo que tienes que hacer sabiendo que %%a corresponde al nombre, que %%b corresponde al apellido y %%c al número, es que poner una opción según sea el caso y luego imprimirlo. Para evitar que find te imprima el echo tienes que redireccionar la salida a nul (find %patron% > nul ) y luego usar && para si el caso es que existe ese patrón, acompañado de la secuencia de comandos correspondiente, y || en caso de no existir el patron.

Ejemplo:
Código
  1. ...
  2. for /F "tokens=1,2,3 delims=:" %%a in (agenda.txt) do (
  3.    if [%opt%] equ [1] echo %%a | find "%nomb%" > nul && (printf "%%a\nNOMBRE\n%%b\nAPELLIDO\n%%c\nTELEFONO")
  4. )
  5. printf "\nFin de la busqueda."
  6. pause
  7. ...

De esta forma excluyes el resto de columnas y sólo validas la fila que te interesa.

Quizás la variable %nomb% debería pasar a llamarse %cadena% o %patron%, y al principio pon condiciones para cambiar el mensaje de entrada según a la opción escogida.

También observe el detalle del uso del printf en vez del echo. Esto es debido a que printf acepta o permite el uso del carácter de salto de línea (\n), aunque también se podría solucionar poniendo 6 echos.


« Última modificación: 4 Abril 2019, 01:08 am por srWhiteSkull » En línea

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 2.159



Ver Perfil
Re: ayuda programacion batch: uso del for /f
« Respuesta #2 en: 4 Abril 2019, 04:36 am »

:xD, ya me había hecho ilusiones con printf, pero veo que mi windows 8 no lo trae. Supongo que srWhiteSkull se refiere a Linux-Bash.

- En windows yo estaba planteándome el siguiente FOR:

Código
  1. FOR /F "tokens=1,2,3 delims=:" %%a IN (agenda.txt) DO (
  2.  ECHO %%a | FIND "%nomb%" >nul
  3.    ECHO Nombre:
  4.    ECHO   %%a
  5.    ECHO Apellido:
  6.    ECHO   %%b
  7.    ECHO Telefono:
  8.    ECHO   %%c
  9.  )
  10. )

-- Pero veo que el FOR de srWhiteSkull es más eficiente al matar varios pájaros de un solo tiro, aunque puede ser más complicado agregar más instrucciones según convenga, como validaciones, bifurcaciones, etc.

-- Mi implementación final sería:

Código
  1. @ECHO OFF
  2. REM ejercicio 9
  3. :menu
  4. CLS
  5. ECHO -------------------------
  6. ECHO - BUSQUEDA DE REGISTROS -
  7. ECHO -------------------------
  8. ECHO 1. Nombre
  9. ECHO 2. Apellido
  10. ECHO 3. Telefono
  11. ECHO 4. Salir
  12. SET "encontrado="
  13. SET /P opt="Selecciona una opcion: "
  14. IF %opt% EQU 1 GOTO opt1
  15. IF %opt% EQU 2 GOTO opt2
  16. IF %opt% EQU 3 GOTO opt3
  17. IF %opt% EQU 4 GOTO opt4
  18. ECHO Opcion no valida
  19. GOTO reiniciar
  20.  
  21. :opt1
  22. SET /P "patron=Buscar por campo Nombre: "
  23. FOR /F "tokens=1,2,3 delims=:" %%a IN (agenda.txt) DO (
  24.  ECHO %%a | FIND /I "%patron%" >nul && CALL :imprimir %%a %%b %%c
  25. )
  26. GOTO reiniciar
  27.  
  28. :opt2
  29. SET /P "patron=Buscar por campo Apellido: "
  30. FOR /F "tokens=1,2,3 delims=:" %%a IN (agenda.txt) DO (
  31.  ECHO %%b | FIND /I "%patron%" >nul && CALL :imprimir %%a %%b %%c
  32. )
  33. GOTO reiniciar
  34.  
  35. :opt3
  36. SET /P "patron=Buscar por campo Telefono: "
  37. FOR /F "tokens=1,2,3 delims=:" %%a IN (agenda.txt) DO (
  38.  ECHO %%c | FIND /I "%patron%" >nul && CALL :imprimir %%a %%b %%c
  39. )
  40. GOTO reiniciar
  41.  
  42. :opt4
  43. SET "opt="
  44. SET "patron="
  45. SET "encontrado="
  46.  
  47. :imprimir
  48. SET "encontrado=SI"
  49. ECHO --------------------
  50. ECHO Nombre:
  51. ECHO   %1
  52. ECHO Apellido:
  53. ECHO   %2
  54. ECHO Telefono:
  55. ECHO   %3
  56. ECHO --------------------
  57. GOTO:EOF
  58.  
  59. :reiniciar
  60. IF NOT "%encontrado%"=="SI" ECHO No se han encontrado ocurrencias
  61. GOTO menu
  62.  
En línea

juntacadaveres

Desconectado Desconectado

Mensajes: 76



Ver Perfil
Re: ayuda programacion batch: uso del for /f
« Respuesta #3 en: 4 Abril 2019, 15:50 pm »

Hola, muchas gracias a ambos por tomaros la molestia de contestar. Creía que nadie lo haría pero habéis contestado rápido y eso me entusiasma a seguir programando.

Y que la variable se llame %patron% me parece bien pensado.
Mi profesor uso el errorlevel en el script pero yo no tenía su código copiado porque había tirado casi la toalla y estaba desanimado. Estaba de malhumor porque muy aparte que me siento casi al final de la clase y su hermosa letra en la pizarra eran factores que acentuaban mi malestar. Es un señor que sabe mucho de informática pero no sabe como transmitir esos conocimientos a los alumnos.
Me podéis explicar el funcionamiento de la variable errorlevel en este script por favor? creo que si lo entiendo aquí ya enteré casi el resto de lo que queda del curso.
Me podrían explicar para qué sirve el doble && y el doble ||
el call usado en el segundo script tiene la misma función que un goto??
es que nos dijo que no veríamos calls y no entiendo esta función.
Y otra cosa,  mi windows no detecta el comando printf. Muchas gracias por vuestro tiempo compañeros.
« Última modificación: 4 Abril 2019, 15:52 pm por juntacadaveres » En línea

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 2.159



Ver Perfil
Re: ayuda programacion batch: uso del for /f
« Respuesta #4 en: 4 Abril 2019, 16:46 pm »

- && comando y || comando también usan ERRORLEVEL, el primero ejecuta comando si ERRORLEVEL es 0 (todo correcto), el segundo ejecuta comando si ERRORLEVEL es 1 o más (algo no salió bien, o no encontró lo que se buscaba ...)

- No sé si hayan tocado el tema de ficheros Batch con parámetros: saludar.bat pepe luego el batch imprime: ECHO Hola %1, que es: Hola pepe

-- Pues CALL hace prácticamente lo mismo, en este caso llama a una etiqueta y le pasa parámetros: CALL:imrpimir %%a %%b %%c luego en la etiqueta se usan los parámetros dados con la sintáxis %1 %2 %3

-- Otra cosa a tener en cuenta es que cuando se usa CALL, una vez finalizadas las intrucciones de la etiqueta, en este caso imprimir que finaliza con un GOTO:EOF, automáticamente "se regresa" a la siguiente instrucción que viene luego de llamar a CALL, vamos es como llamar a un ECHO hola, imprime el hola y continúa el programa, lo mismo con el CALL, ejecuta el CALL y continúa el programa.

- Te recomiendo ver la siguiente referencia de comandos completa, está en inglés:

https://ss64.com/nt/call.html
https://ss64.com/nt/errorlevel.html
https://ss64.com/nt/find.html
https://ss64.com/nt/syntax-args.html
...

- Si tu profesor te ha dado documentación o ejercicios haber si los puedes compartir  :xD, ya que no muy normal que enseñen batch a nivel programación, siempre he visto que enseñan a nivel comandos básicos de consulta y búsqueda: dir, find, md, attrib, etc.
En línea

juntacadaveres

Desconectado Desconectado

Mensajes: 76



Ver Perfil
Re: ayuda programacion batch: uso del for /f
« Respuesta #5 en: 4 Abril 2019, 18:17 pm »

- && comando y || comando también usan ERRORLEVEL, el primero ejecuta comando si ERRORLEVEL es 0 (todo correcto), el segundo ejecuta comando si ERRORLEVEL es 1 o más (algo no salió bien, o no encontró lo que se buscaba ...)

- No sé si hayan tocado el tema de ficheros Batch con parámetros: saludar.bat pepe luego el batch imprime: ECHO Hola %1, que es: Hola pepe

-- Pues CALL hace prácticamente lo mismo, en este caso llama a una etiqueta y le pasa parámetros: CALL:imrpimir %%a %%b %%c luego en la etiqueta se usan los parámetros dados con la sintáxis %1 %2 %3

-- Otra cosa a tener en cuenta es que cuando se usa CALL, una vez finalizadas las intrucciones de la etiqueta, en este caso imprimir que finaliza con un GOTO:EOF, automáticamente "se regresa" a la siguiente instrucción que viene luego de llamar a CALL, vamos es como llamar a un ECHO hola, imprime el hola y continúa el programa, lo mismo con el CALL, ejecuta el CALL y continúa el programa.

- Te recomiendo ver la siguiente referencia de comandos completa, está en inglés:

https://ss64.com/nt/call.html
https://ss64.com/nt/errorlevel.html
https://ss64.com/nt/find.html
https://ss64.com/nt/syntax-args.html
...

- Si tu profesor te ha dado documentación o ejercicios haber si los puedes compartir  :xD, ya que no muy normal que enseñen batch a nivel programación, siempre he visto que enseñan a nivel comandos básicos de consulta y búsqueda: dir, find, md, attrib, etc.

Muchas gracias por la información.
 Sí. compartiré todos los scripts y ejercicios que hayamos echo en este curso cuando acabe primero de asir porque capaz se de cuenta que he ido compartiendo la solución a sus ejercicios de programación en batch y conociéndolo capaz me suspende el módulo entero de IMSO (implantación de sistemas operativos).
De todos modos, seguro que me asaltarán más dudas sobre programación en batch que iré posteando en este foro a media que surjan. Un saludo.
En línea

juntacadaveres

Desconectado Desconectado

Mensajes: 76



Ver Perfil
Re: ayuda programacion batch: uso del for /f
« Respuesta #6 en: 4 Abril 2019, 20:14 pm »

Hola tengo una duda en cuanto el errorlevel
si un errorlevel a cero significa que la acción que buscaba se realizó satisfactoriamente
porque en este codigo

Código
  1. set /p parametro="Indique nombre a buscar: "
  2. for /F "tokens=1,2,3 delims=:" %%a in (agenda.txt) do (
  3.    echo %%a | find /I "%parametro%" >nul
  4.    IF NOT ERRORLEVEL 1 (
  5.        echo ---------------
  6.        echo Nombre
  7.        echo %%a
  8.        echo Apellido
  9.        echo %%b
  10.        echo Telefono
  11.        echo %%c
  12.        echo ---------------
  13.    )
  14. )
  15. pause>nul
  16. goto menu
  17.  

si cambiase el
Código:
IF NOT ERRORLEVEL 1

a por
Código:
IF ERROR LEVEL 0

el script me deja de funcionar. Por qué?
y en todo aso
el valor del errorlevel hace referencia a la ultima acción que se realizo verdad?
o sea, que podría usar varios errorlevels en el mismo script
pero sus valores apuntarían a diferentes comandos. No se como explicarme en esto ultimo.
« Última modificación: 4 Abril 2019, 20:21 pm por juntacadaveres » En línea

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 2.159



Ver Perfil
Re: ayuda programacion batch: uso del for /f
« Respuesta #7 en: 4 Abril 2019, 20:42 pm »

- Porque el ERRORLEVEL que trabaja en la sentencia IF es un poco diferente:

IF ERRORLEVEL 0 => Significa Si el ERRORLEVEL es 0 o mayor

IF ERRORLEVEL 1 => Significa Si el ERRORLEVEL es 1 o mayor

IF NOT ERRORLEVEL 0 => Significa Si el ERRORLEVEL es menor que 0

IF NOT ERRORLEVEL 1 => Significa Si el ERRORLEVEL menor que 1

- Por esto, en la documentación de ERRORLEVEL https://ss64.com/nt/errorlevel.html comentan que podría ser más humano usar la variable %ERRORLEVEL% en lugar de ERRORLEVEL puro y duro:

IF %ERRORLEVEL% EQU 0 => Significa Si el ERRORLEVEL es 0

IF %ERRORLEVEL% GTR 0 => Significa Si el ERRORLEVEL mayor que 0

-- PERO hay que tener cuidado cuando se usa EnableDelayedExpansion porque hay que poner !ERRORLEVEL! en lugar de %ERRORLEVEL%

https://ss64.com/nt/delayedexpansion.html
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda sobre programacion BATCH
Scripting
DanielB 6 4,370 Último mensaje 9 Marzo 2008, 12:49 pm
por DanielB
Ayuda con programacion en Batch
Scripting
sharkdragon 3 3,336 Último mensaje 26 Junio 2008, 02:56 am
por leogtz
ayuda con programacion batch
Scripting
sharkdragon 2 2,744 Último mensaje 13 Junio 2008, 20:34 pm
por sharkdragon
Ayuda con un examen, programacion BATCH
Scripting
itek 0 3,720 Último mensaje 14 Diciembre 2009, 13:30 pm
por itek
Ayuda en programacion de batch
Scripting
47anonimo74 9 5,332 Último mensaje 29 Junio 2011, 12:33 pm
por WaAYa HaCK
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines