Osiągnięto maksymalny ustalony poziom rekurencji. Nie możesz wydrukować więcej niż 30 razy?

1

Chcę wydrukować określoną liczbę haseł do pliku. Kod, który znalazłem na tej stronie, jest dla 30 pętli, jak widzę i chcę wydrukować znacznie więcej, powiedzmy 1000. Po kilku uruchomieniach dostaję to, błąd? „Osiągnięto maksymalny ustalony poziom rekurencji.” Jak mogę to naprawić?

@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
Unix
źródło

Odpowiedzi:

1

„Osiągnięto maksymalny ustalony poziom rekurencji.” Jak mogę to naprawić?

Przenieś polecenia setlocali setprzed pętlą. Nie musisz ich wykonywać wiele razy.

Inne rzeczy, które powinny zostać naprawione:

  • echo pwd=%pwd% >> D:\password.txtmusi zostać przeniesiony (w przeciwnym razie pierwszy wiersz pliku nie będzie miał password=wartości
  • Dodaj setlocal(bez argumentów) również na początku (w przeciwnym razie twoje zmienne są ustawione w otaczającej powłoce cmd)
  • Dodaj dopasowanie endlocalna końcu pliku
  • Zobacz wyjaśnienie poniżej dotyczące używania setlocal/endlocal
  • Masz miejsce, w set execute counter=0którym nie powinno go być
  • rnd_nummusi być pomiędzy, 0a 61 nie 0 i 62(w przeciwnym razie ECHOhasło jest wstawiane, gdy rnd_numjest62

Oto naprawiony plik wsadowy:

@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 samodzielnie, zwykle na początku pliku wsadowego, rozpocznie lokalizację zmiennych środowiskowych.

Wydając polecenie SETLOCAL, skrypt wsadowy odziedziczy wszystkie bieżące zmienne ze środowiska / sesji master.

Wydanie polecenia ENDLOCAL przywróci wszystkie zmienne środowiskowe obecne przed wydaniem SETLOCAL.

Jeśli skrypt wsadowy nie używa SETLOCAL i ENDLOCAL, wówczas wszystkie zmienne będą Globalne, tzn. Widoczne i modyfikowalne przez inne skrypty.

Chociaż zmienne globalne są łatwe w obsłudze, nie są dobrą praktyką - na przykład, jeśli masz kilka skryptów wsadowych zajmujących się nazwami plików (a te skrypty wywołują się nawzajem), pierwszy skrypt ma zmienną o nazwie _filename, drugi skrypt inną zmienną o nazwie file-name (inna nazwa, aby uniknąć konfliktu z pierwszym skryptem) trzeci skrypt potrzebuje teraz czegoś takiego jak nazwa_pliku, który szybko staje się bardzo trudny do zarządzania.

W przypadku zmiennych lokalnych możesz używać tych samych nazw zmiennych w wielu skryptach wsadowych - nie ma konfliktu, ponieważ zmienne lokalne nie są widoczne dla żadnego innego skryptu.

Zmienne lokalne można przekazywać z jednej procedury wsadowej do drugiej za pomocą polecenia ENDLOCAL.

Źródło setlocal - Ustaw opcje kontrolujące widoczność zmiennych środowiskowych w pliku wsadowym.


Dalsza lektura

DavidPostill
źródło
Myślę, że ta nierozstrzygnięta sprawa została tak postawiona z jakiegoś powodu. Skrypt właśnie się zepsuł i nie respektuje parametrów generacji. W ten sposób powinno generować hasła: pwd = 6k4BjpSkCjFhuSOta pwd = zmjUzgpgwD3gQnylC I to jest to, co robi teraz: pwd = oHxgUX7HN2lSLXeyH pwd = oHxgUX7HN2lSLXeyHHrjdsC0vTex93tH1M pwd = oHxgUX7HN2lSLXeyHHrjdsC0vTex93tH1MKI0ZP5nJj7VgwFEPN pwd = oHxgUX7HN2lSLXeyHHrjdsC0vTex93tH1MKI0ZP5nJj7VgwFEPNywaE8dzVEgVnwBvMR pwd = oHxgUX7HN2lSLXeyHHrjdsC0vTex93tH1MKI0ZP5nJj7VgwFEPNywaE8dzVEgVnwBvMRJB8xZYWDp3GBx6SiECHO. Jest dodawany do pierwszego wygenerowanego ...
Unix
1
@Unix Przepraszam, mój błąd set pwd=musi być w pętli. Jest jednak inny (inny) błąd. Odpowiedź poprawiona.
DavidPostill
1
Jest inny problem, który zauważyłem, którego nie byłem w stanie naprawić - co ECHOjakiś czas pojawia się w środku hasła, np pwd=HVc6GH1DWxECHOmPwrjF. Zauważyłem to, kiedy patrzyłem na twoje poprzednie pytanie. Nie mam pojęcia, dlaczego :(
DavidPostill
1
Znaleziono to. Dzieje się tak tylko wtedy, gdy rnd_num=62. Usuń +1koniec rnd_numobliczeń> SET /A rnd_num=!RANDOM! * 62 / 32768. Odpowiedź zaktualizowana;)
DavidPostill
1
@Unix Tak, zmień na 15 dla haseł o długości 16. Wygeneruje hasła tak duże, jak chcesz (spróbowałbym jednak zbyt wielu, zajmie to zbyt długo). Mam go działającego dla (0, 1, 100), który ma 101 znaków.
DavidPostill