"Максимальный заданный локальный уровень рекурсии достигнут." Как я могу это исправить?
Переместите setlocal и set команды перед циклом. Вам не нужно выполнять это несколько раз.
Другие вещи, которые должны быть исправлены:
echo pwd=%pwd% >> D:\password.txt необходимо переместить (в противном случае первая строка файла будет password= без значения
- Также добавьте
setlocal (без аргументов) в начале (иначе ваши переменные будут установлены в оболочке cmd)
- Добавьте соответствующий
endlocal в конце файла
- Смотрите объяснение ниже относительно использования
setlocal/endlocal
- У вас есть пробел в
set execute counter=0 которого там быть не должно
rnd_num должно быть от 0 до 61 не от 0 до 62 (в противном случае ECHO вставляется в пароль, если rnd_num равно 62
Вот исправленный пакетный файл:
@echo off
set executecounter=0
setlocal
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
set alfanum=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
:loop
(@Echo off
rem 16 stings pwd
set pwd=
FOR /L %%b IN (0, 1, 16) DO (
SET /A rnd_num=!RANDOM! * 62 / 32768
for /F %%c in ('echo %%alfanum:~!rnd_num!^,1%%') do set pwd=!pwd!%%c
)
)
echo pwd=%pwd% >> D:\password.txt
set /a executecounter=%executecounter%+1
if "%executecounter%"=="1000" goto done
goto loop
:done
echo Complete!
endlocal
pause
SETLOCAL сам по себе, обычно в начале командного файла, начнет локализацию переменных среды.
При выполнении команды SETLOCAL пакетный скрипт унаследует все текущие переменные из основной среды / сеанса.
Выполнение команды ENDLOCAL восстановит все переменные окружения, существующие до того, как был выпущен SETLOCAL.
Если пакетный сценарий не использует SETLOCAL и ENDLOCAL, тогда все переменные будут глобальными, то есть видимыми и изменяемыми другими сценариями.
Хотя с глобальными переменными легко работать, они не являются хорошей практикой - например, если у вас есть несколько пакетных сценариев, имеющих дело с именами файлов (и эти сценарии вызывают друг друга), первый сценарий имеет переменную с именем _filename, второй сценарий - другую переменную называется file-name (другое имя, чтобы избежать конфликта с первым скриптом), для третьего скрипта теперь нужно что-то вроде file_name, которым быстро становится очень трудно управлять.
С локальными переменными вы можете использовать одни и те же имена переменных в нескольких пакетных сценариях - конфликта нет, потому что локальные переменные не видны ни одному другому сценарию.
Локальные переменные могут передаваться из одной пакетной процедуры в другую с помощью команды ENDLOCAL.
Source setlocal - Установите параметры для контроля видимости переменных среды в пакетном файле.
Дальнейшее чтение