"Максимальный заданный локальный уровень рекурсии достигнут." Как я могу это исправить?
Переместите 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 - Установите параметры для контроля видимости переменных среды в пакетном файле.
Дальнейшее чтение