Tengo un problema mi Batch Scriptin NO entra al For luego de otro For

Estoy intentando comprobar la existencial de algo dentro de un txt para luego por medio de un goto dejar pasar o dar error lo deje marcado en el código como

::----------Me da error-------

:Alumnomodi
Cls
Setlocal EnableDelayedExpansion
Echo Digite Cedula a modificar
set /p cedula=
::--------------------comprobar cedula------------
for /f "tokens=1,2,3,4,5,6,* delims=;" %%a in ('type C:\alumnoslista.txt ^|find "%cedula%"') do (
   if %%f==%cedula% ( 
   goto continuaalumno1
   ) else goto noexistealumno1
   )
::----------------------Fin comprabar cedula------------------------------- 
:Noexistealumno1
Echo cedula %cedula% no existe 
Pause
goto :menu2
::----------Menu ----------------------
:Menu2
Cls
Echo Desea modificar otro alumno
Echo.
Echo "1" Si
Echo "2" Atras
set /p opc=
if %opc% equ 1 goto :alumnomodi
if %opc% equ 2 goto :ABMBLAlumnos
goto :menu2
::---------------fin de menu------------------
:continuaalumno1
echo --------------------------------------------------------------------------
for /f "tokens=1,2,3,4,5,6,* delims=;" %%a in ('type c:\alumnoslista.txt') do (
   if %%f==%cedula% (
      Echo Alumno: 
      Echo Curso:%%a Nombre:%%b Apellido:%%c Edad:%%d F.N:%%e C.I:%%f
echo --------------------------------------------------------------------------
::-------------------------Menu curso------------------------------------------
:Nocontinua
echo "Cursos Disponibles"
Echo.
For /f "tokens=1,2,3,4,5,6,* delims=;" %%a in ('type C:\cursolista.txt') do (
        echo %%a; Codigo:%%b
)
::------------Me da error ------ 
  Echo.
    Echo Ingrese Codigo de Curso
    set /p curso=
    for /f "tokens=1,2,3,4,5,6,* delims=;" %%a in ('type C:\cursolista.txt ^|find "%curso%"') do (
    if %%b==%curso% ( 
    goto  continuaalumno2
    ) else goto nocontinua
     ) 
:Continuaalumno2
::----------------------------------------
      Echo "Nombre"
      set /p nombre=
      Echo.
      Echo "Apellido"
      set /p apellido=
      Echo.
      Echo "Edad"
      set /p edad=
      echo "Cedula"
      set /p cedula=
      echo Se guardo !curso!;!nombre!;!apellido!;!edad!;%date%;!cedula!
      pause
      echo !curso!;!nombre!;!apellido!;!edad!;%date%;!cedula!;>>c:\kkk.txt
      ) else echo %%a;%%b;%%c;%%d;%%e;%%f;%%g>>c:\kkk.txt
   )
      Copy /y C:\kkk.txt C:\alumnoslista.txt>nul
   del /q C:\kkk.txt
Cls
Echo Desea modificar otro Alumno
Echo.
Echo "1" Si
Echo "2" Atras
set /p opc=
if %opc% equ 1 goto :alumnomodi
if %opc% equ 2 goto :ABMBLAlumnos
goto :error

1 Respuesta

Respuesta
1

Observo que has dejado partes de un código anterior que no encajan en el "diseño" actual. Me refiero al código que está entre el ":Continuaalumno2" y el "Copy /y C:\kkk.txt C:\alumnoslista.txt>nul". Eso formaba parte de un IF anterior (con su ELSE) y ahora se ha dejado "descolgado". Además creo que las referencias a la variable CURSO tendrás que hacerlas como ! CURSO! Y no como %CURSO%.

Hola, comento que al cambiar de %curso% a ! Curso! Me funciono y ahora entra en el FOR de comprobación del curso, lamentablemente el nuevo problema es que no guarda la línea siguiente en el txt ej si son 5 líneas de txt y modificas la 3 línea las otras 2 restantes no las guarda

:alumnomodi
cls
Setlocal EnableDelayedExpansion
Echo Digite Cedula a modificar
set /p cedula=
::--------------------comprobar cedula------------
for /f "tokens=1,2,3,4,5,6,* delims=;" %%a in ('type C:\alumnoslista.txt ^|find "%cedula%"') do (
   if %%f==%cedula% ( 
   goto continuaalumno1
   ) else goto noexistealumno1
   )
::----------------------Fin comprabar cedula------------------------------- 
:noexistealumno1
Echo cedula %cedula% no existe 
Pause
goto :menu2
::----------menu ----------------------
:menu2
cls
Echo Desea modificar otro alumno
Echo.
Echo "1" Si
Echo "2" Atras
set /p opc=
if %opc% equ 1 goto :alumnomodi
if %opc% equ 2 goto :ABMBLAlumnos
goto :menu2
::---------------Fin de menu------------------
  :continuaalumno1
  :nocontinua
    cls
    Echo --------------------------------------------------------------------------
    for /f "tokens=1,2,3,4,5,6,* delims=;" %%a in ('type c:\alumnoslista.txt') do (
   if %%f==%cedula% (
      Echo Alumno: 
      Echo Curso:%%a Nombre:%%b Apellido:%%c Edad:%%d F.N:%%e C.I:%%f
 echo --------------------------------------------------------------------------
    ::-------------------------menu curso------------------------------------------
    Echo "Cursos Disponibles"
    Echo.
    for /f "tokens=1,2,3,4,5,6,* delims=;" %%a in ('type C:\cursolista.txt') do (
            echo %%a; Codigo:%%b
    )
    Echo.
    Echo Ingrese Codigo de Curso
    set /p curso=
        for /f "tokens=1,2,3,4,5,6,* delims=;" %%a in ('type C:\cursolista.txt ^|find "!curso!"') do (
    if %%b==!curso! ( 
    goto  continuaalumno2
    ) else goto nocontinua
     ) 
:continuaalumno2
      Echo.
      Echo "Nombre"
      set /p nombre=
      Echo.
      Echo "Apellido"
      set /p apellido=
      Echo.
      Echo "Edad"
      set /p edad=
      Echo.
      Echo "Cedula"
      set /p cedula=
      echo.
      echo Se guardo !curso!;!nombre!;!apellido!;!edad!;%date%;!cedula!
      pause
      echo !curso!;!nombre!;!apellido!;!edad!;%date%;!cedula!;>>c:\kkk.txt
      ) else echo %%a;%%b;%%c;%%d;%%e;%%f;%%g>>c:\kkk.txt
   )
   )
      Copy /y C:\kkk.txt C:\alumnoslista.txt>nul
   del /q C:\kkk.txt
cls
echo Desea modificar otro Alumno
echo.
echo "1" Si
echo "2" Atras
set /p opc=
if %opc% equ 1 goto :alumnomodi
if %opc% equ 2 goto :ABMBLAlumnos
goto :error

se me fue un ")" a lo ultimo antes del copy, aclaro que fue corregido pero aun tengo el problema, gracias

No me has hecho mucho caso a lo que te decía en mi primera respuesta. Siguen quedando los restos de ese otro IF con su ELSE. Precisamente ese ELSE (cuando estaba presente el IF) era el responsable de grabar en KKK.TXT los registros que no se modificaban. Ahora se ha quedado descolgado y no se ejecuta nunca. El problema es que ahora quieres controlar dos cosas simultáneamente, una la modificación del registro correspondiente a la "cédula" indicada y otra que el curso indicado esté en la lista de cursos. Pero tienes que revisar el código y ajustarlo adecuadamente.

No me queda claro eso que me indicas de un resto de IF y el ELSE, te pido que me indiques donde ubicas eso, ya que no lo veo.

Con respecto a la lista Curso, la idea es que se muestre en pantalla el txt cursolista.txt y compruebe que el codigo que ingresa el usuario sea correcto y luego continuar con la modificación. 

Muchas Gracias.

Veamos. En tu larguísimo BAT final del 16 de septiembre (consulta Como comparo, elimino y modifico una línea en un txt desde batch ) la parte que afectaba a la modificación de los datos de un alumno era:

:Continuaalumno1
for /f "tokens=1,2,3,4,5,6,* delims=;" %%a in ('type c:\alumnoslista.txt') do (
   if %%f==%cedula% (
      Echo el registro %%a,%%b,%%c,%%d,%%e,%%f,%%g
      ::-------------------------Menu curso------------------------------------------
      Echo.
      Echo "Seleccione Curso"
      Echo.
      type c:\cursolista.txt
      echo.
      echo.
      echo Ingrese Codigo de Curso
      set /p curso=
      Echo.
      ::-------------------------Fin menu curso--------------------------------------------
      Echo "Nombre"
      set /p nombre=
      Echo.
      Echo "Apellido"
      set /p apellido=
      Echo.
      Echo "Edad"
      set /p edad=
      echo "Cedula"
      set /p cedula=
      echo Se guardo !curso!;!nombre!;!apellido!;!edad!;%date%;!cedula!
      pause
      echo !curso!;!nombre!;!apellido!;!edad!;%date%;!cedula!>>c:\kkk.txt
      ) else echo %%a;%%b;%%c;%%d;%%e;%%f;%%g>>c:\kkk.txt
   )
   copy /y C:\kkk.txt C:\alumnoslista.txt>nul
   del /q C:\kkk.txt

Lo he formateado un poco para mantener la alineación de las instrucciones y resaltar que

      ) else echo %%a;%%b;%%c;%%d;%%e;%%f;%%g>>c:\kkk.txt

forma parte del

   if %%f==%cedula% (

En el bat de esta consulta aparece:

 Echo.
      Echo "Nombre"
      set /p nombre=
      Echo.
      Echo "Apellido"
      set /p apellido=
      Echo.
      Echo "Edad"
      set /p edad=
      Echo.
      Echo "Cedula"
      set /p cedula=
      echo.
      echo Se guardo !curso!;!nombre!;!apellido!;!edad!;%date%;!cedula!
      pause
      echo !curso!;!nombre!;!apellido!;!edad!;%date%;!cedula!;>>c:\kkk.txt
      ) else echo %%a;%%b;%%c;%%d;%%e;%%f;%%g>>c:\kkk.txt
   )
   copy /y C:\kkk.txt C:\alumnoslista.txt>nul
   del /q C:\kkk.txt

pero se ha perdido el IF al que corresponde este último ELSE. Y este ELSE es el que grababa los registros que no se modificaban. Ahí es donde está el problema.

el ELSE que me mencionas empieza en 

for /f "tokens=1,2,3,4,5,6,* delims=;" %%a in ('type c:\alumnoslista.txt') do (
   if %%f==%cedula% (
      echo Alumno: 
      echo Curso:%%a Nombre:%%b Apellido:%%c Edad:%%d F.N:%%e C.I:%%f

y termina en 

      echo Se guardo !curso!;!nombre!;!apellido!;!edad!;%date%;!cedula!
      pause
      echo !curso!;!nombre!;!apellido!;!edad!;%date%;!cedula!;>>c:\kkk.txt
      ) else echo %%a;%%b;%%c;%%d;%%e;%%f;%%g>>c:\kkk.txt
   )

claramente hay mucho en el medio jejej

Bien. Creo que tienes razón y que, efectivamente parece ser así. En mi descargo diré que el código resultaba muy confuso al no estar alineado ("indentado" creo que se dice en estos casos). Pero si anidas un FOR dentro de otro no puedes usar el mismo rango de variables. El FOR anterior al IF de la primera ventana utiliza las variables de %%a a %%g, pero hay otro FOR dentro de él que vuelve a usar las mismas variables con lo que cambiarán de valor "dinámicamente". En estos casos habría que usar otro rango, por ejemplo %%h y %%i puesto que para los registros de CURSOLISTA.TXT basta con dos campos. Y no tengo muy claro que baste con eso. Ahora no puedo probar más. Cuando tenga un rato lo intentaré.

Ya he tenido un rato para hacer pruebas.

En el pasado ya me había tropezado con problemas cuando intentaba usar GOTO a etiquetas dentro de un bucle y nunca profundicé en el asunto, simplemente buscaba otra solución que no las utilizara. Al probar esta vez la versión (corregida en cuanto al uso de diferentes variables en los distintos FOR anidados) ya no me quedó más remedio que enfrentarme al problema. Mi conclusión es que un GOTO dentro de un FOR lo "rompe", incluso aunque el destino del GOTO esté dentro del propio FOR. Intentaré aclararlo con un ejemplo ajustado a tu caso.

En primer lugar prueba a ejecutar este bat:

@echo off
for /f "tokens=1,2,3,4,5,6,* delims=;" %%a in ('type c:\alumnoslista.txt') do (
   echo Registro %%a;%%b;%%c;%%d;%%e;%%f;%%g
   ::goto seguir
   :seguir
   echo Sigue y sigue
   )

Comprobarás que te presenta una lista con todos los alumnos del archivo ALUMNOSLISTA.TXT.

A continuación "descomenta" la línea del GOTO:

@echo off
for /f "tokens=1,2,3,4,5,6,* delims=;" %%a in ('type c:\alumnoslista.txt') do (
   Echo Registro %%a;%%b;%%c;%%d;%%e;%%f;%%g
 goto seguir
 :seguir
 echo Sigue y sigue
 )

Comprobarás que, aunque el GOTO no debería hacer nada puesto que envía a la instrucción que está a continuación, solo se presenta el primer registro del archivo porque, de alguna manera, la presencia del GOTO "rompe" el bucle FOR.

Aplicado a tu caso esto explica que no se guarden las líneas posteriores a la del alumno modificado. Cuando se encuentra el alumno a modificar se ejecuta el "goto continuaalumno2" y eso "rompe" el bucle FOR de tratamiento de alumnos, se guarda el archivo modificado y se sale de ese bucle, reescribiendo el archivo ALUMNOSLISTA.TXT.

Por tanto tendrás que pensar en otra forma de hacer lo que pretendes. Uno de los trucos que he usado alguna vez es usar una variable de control (digamos ENCONTRADO, por ejemplo) a la que se le asigna un valor (digamos 1) cuando se da la condición (en lugar de ejecutar un GOTO). Luego se comprueba el valor de la variable y se actúa en consecuencia.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas