[Batch] "Se ha alcanzado el nivel maximo de recursividad de "setlocal""

Iniciado por bITEBUG, 11 Junio 2011, 03:26 AM

0 Miembros y 2 Visitantes están viendo este tema.

bITEBUG

Primero que nada quiero pedir disculpas por algunos de mis post en los que he hecho preguntas acerca de errores que solamente eran generados a causa de el entorno especifico en el que trabajo dentro de Xp, o sea un registro caotico e incomprensible luego de años de modificaciones desmedidas, instale freedos y adios problema!

Acerca de el asunto de este post, espero que no sea otro de estos errores, porque aun no lo he probado en freedos, pero por lo que he visto por internet no soy el unico que se ha topado con este error.
¿A que se debe?

SuperDraco

SETLOCAL

Si las extensiones de comando están habilitadas, SETLOCAL cambia así:

Ahora el comando por lotes SETLOCAL acepta argumentos opcionales:
        ENABLEEXTENSIONS / DISABLEEXTENSIONS
            Habilita o deshabilita las extensiones del procesador de comandos
            Estos argumentos tienen prioridad sobre los modificadores CMD E:O
            o /E:OFF. Vea CMD /? para obtener más detalles.
        ENABLEDELAYEDEXPANSION / DISABLEDELAYEDEXPANSION
            Habilita o deshabilita la expansión de variables de entorno
            retardada. Estos argumentos tienen prioridad sobre los
            modificadores CMD /V:ON o /V:OFF. Vea CMD /? para obtener más
            detalles.
Estas modificaciones duran hasta que coincida el comando ENDLOCAL,
independientemente de su configuración anterior para el comando SETLOCAL.

El comando SETLOCAL establecerá el valor de ERRORLEVEL si se diera un
argumento. Será cero si se da uno de los dos argumentos válidos y el otro no.
Puede usar esto en los scripts por lotes para determinar si las extensiones
están disponibles con la siguiente técnica:

    VERIFY OTHER 2>null
    SETLOCAL ENABLEEXTENSIONS
    IF ERRORLEVEL 1 echo No puede habilitar las extensiones

Esto funciona porque, en las versiones anteriores de CMD.EXE, SETLOCAL
NO establecía el valor de ERRORLEVEL. El comando VERIFY con un argumento
erróneo inicializa el valor de ERROLEVEL a un valor distinto de cero.



Supongo que por algo relacionado con la memoria.

Se soluciona con un simple y efectivo:

ENDLOCAL
No he vuelto, solo estoy de paso.

bITEBUG

¿O sea que conviene poner un setlocal antes de cada apertura y un enlocal despues de cada cierre en vez de un solo setlocal al principio del batch?

SuperDraco

Cita de: bITEBUG en 11 Junio 2011, 09:24 AM
¿O sea que conviene poner un setlocal antes de cada apertura y un enlocal despues de cada cierre en vez de un solo setlocal al principio del batch?

No se tanto como para resolverte al 100% esa pregunta, lo que si te puedo decir es que comprobé que al llegar al limite de recursividad, un ENDLOCAL lo soluciona, pero por otro lado, despues de utilizar ENDLOCAL, el límite de recursividad se acortará bastante más, así que por lógica supongo que si tienes problemas con el límiite, lo debes usar en cada cierre.

saludosss
No he vuelto, solo estoy de paso.

bITEBUG

Acabo de leer la ayuda de nuevo, no sabia que endlocal cambiaba el errorlevel :S

erickesau

Cita de: pitoloko en 11 Junio 2011, 04:08 AM
SETLOCAL

Si las extensiones de comando están habilitadas, SETLOCAL cambia así:

Ahora el comando por lotes SETLOCAL acepta argumentos opcionales:
        ENABLEEXTENSIONS / DISABLEEXTENSIONS
            Habilita o deshabilita las extensiones del procesador de comandos
            Estos argumentos tienen prioridad sobre los modificadores CMD E:O
            o /E:OFF. Vea CMD /? para obtener más detalles.
        ENABLEDELAYEDEXPANSION / DISABLEDELAYEDEXPANSION
            Habilita o deshabilita la expansión de variables de entorno
            retardada. Estos argumentos tienen prioridad sobre los
            modificadores CMD /V:ON o /V:OFF. Vea CMD /? para obtener más
            detalles.
Estas modificaciones duran hasta que coincida el comando ENDLOCAL,
independientemente de su configuración anterior para el comando SETLOCAL.

El comando SETLOCAL establecerá el valor de ERRORLEVEL si se diera un
argumento. Será cero si se da uno de los dos argumentos válidos y el otro no.
Puede usar esto en los scripts por lotes para determinar si las extensiones
están disponibles con la siguiente técnica:

    VERIFY OTHER 2>null
    SETLOCAL ENABLEEXTENSIONS
    IF ERRORLEVEL 1 echo No puede habilitar las extensiones

Esto funciona porque, en las versiones anteriores de CMD.EXE, SETLOCAL
NO establecía el valor de ERRORLEVEL. El comando VERIFY con un argumento
erróneo inicializa el valor de ERROLEVEL a un valor distinto de cero.



Supongo que por algo relacionado con la memoria.

Se soluciona con un simple y efectivo:

ENDLOCAL




tengo el mismo error mi codigo es el siguiente



setlocal DisableDelayedExpansion

set BUILDIR=PROYECTO\models\EEMFile
set INTEXTFILE=script-player-delete%num%.txt

set OUTTEXTFILE=temp.txt
set SEARCHTEXT=%cd1%\
set VER=-delete "
set OUTPUTLINE=

for /f "tokens=1,* delims=¶" %%A in ( %BUILDIR%\%INTEXTFILE% ) do (
    SET string=%%A
    setLocal EnableDelayedExpansion
    SET modified=!string:%SEARCHTEXT%=%VER%!
    echo.!modified! >> %BUILDIR%\%OUTTEXTFILE%
    endlocal
)

del %BUILDIR%\%INTEXTFILE%
rename %BUILDIR%\%OUTTEXTFILE% %INTEXTFILE%




me da el mismo error despues de usarlos en mas de apriximadamente 13 veces seguidas ayuda

Eleкtro

Cita de: erickesau en 27 Febrero 2015, 08:42 AM
tengo el mismo error mi codigo es el siguiente

me da el mismo error despues de usarlos en mas de apriximadamente 13 veces seguidas ayuda

1. Debes utiliza las etiquetas GeShi para insertar código, lee las normas del foro de programación.

2. Está prohibido revivir un tema antiguo para formular otra pregunta, lee las normas del foro elhacker.net.

Dicho esto, estás activando/desactivando la expansión de las variables y llegas al límite de la pila, prueba así:

@Echo OFF & SetLocal EnableDelayedExpansion

Set "buildDir=.\PROYECTO\models\EEMFile"
Set "srcFilename=script-player-delete%num%.txt"
Set "outFilename=temp.txt"
Set "searchText=%cd1%\"
Set "ver=-delete "" & REM "
Set "outputLine="

(
   For /F "UseBackQ Tokens=1 Delims=¶" %%# in (
       "%buildDir%\%srcFilename%"
   ) Do (
       Set "str=%%#"
       Set "mod=!str:%searchText%=%ver%!"
       Echo.!mod!
   )
)>"%buildDir%\%outFilename%"

Del "%buildDir%\%srcFilename%"
Ren "%buildDir%\%outFilename%" "%srcFilename%"

Pause&Exit /B 0


Si tienes más dudas sobre el tema, crea un nuevo post.

Tema cerrado.

Saludos!