1

Я хочу напечатать определенное количество паролей в файл. Код, который я нашел на этом сайте, рассчитан на 30 циклов, и я хочу напечатать гораздо больше, скажем, 1000. После нескольких прогонов я получаю это, ошибка? "Максимальный заданный локальный уровень рекурсии достигнут." Как я могу это исправить?

@echo off
set execute counter=0
:loop
(@Echo off  
rem 16 stings pwd

setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
set alfanum=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789

set pwd=
FOR /L %%b IN (0, 1, 16) DO (
SET /A rnd_num=!RANDOM! * 62 / 32768 + 1
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!
pause

1 ответ1

1

"Максимальный заданный локальный уровень рекурсии достигнут." Как я могу это исправить?

Переместите 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 - Установите параметры для контроля видимости переменных среды в пакетном файле.


Дальнейшее чтение

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .