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?
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
¿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?
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
Acabo de leer la ayuda de nuevo, no sabia que endlocal cambiaba el errorlevel :S
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
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!