Buenas justo andaba mirando generadores por el foro, y me ha surgido la necesidad de registrarme para responderte, lo cierto es que ya tardaba porque me he mirado muchas veces este foro y me encanta.
Creo que el problema despues de haberlo probado yo personalmente es que el endlocal esta mal puesto, por eso te daba el error de maximo de recursividad del setlocal. Te adjunto el codigo que a mi me ha funcionado:
@Echo Off
:menu
cls
echo Generador de Claves
echo.
echo 1. Generar Clave.
echo 2. Salir.
set /p var=
if %var%==1 goto :pregunta
if %var%==2 goto exit
if %var% gtr 2 echo error
goto :menu
:pregunta
cls
set /p lengthnumberuser="Cantidad de caracteres? "
if %lengthnumberuser% gtr 0 goto :clave
if %lengthnumberuser% == 0 echo error
goto :pregunta
:clave
cls
Setlocal EnableDelayedExpansion
Set _RNDLength=%lengthnumberuser%
Set _Alphanumeric=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
Set _Str=%_Alphanumeric%9876543210
:_LenLoop
IF NOT "%_Str:~18%"=="" SET _Str=%_Str:~9%& SET /A _Len+=9& goto :_LenLoop
SET _tmp=%_Str:~9,1%
SET /A _Len=_Len+_tmp
Set _count=0
SET _RndAlphaNum=
:_loop
Set /a _count+=1
SET _RND=%Random%
Set /A _RND=_RND%%%_Len%
SET _RndAlphaNum=!_RndAlphaNum!!_Alphanumeric:~%_RND%,1!
If !_count! lss %_RNDLength% goto :_loop
echo Clave Aleatoria: !_RndAlphaNum!
endlocal
echo.
echo 1. Generar Clave
echo 2. Volver
set /p var=
if %var%==1 goto :pregunta
if %var%==2 goto :menu
if %var% gtr 2 echo error