„Osiągnięto maksymalny ustalony poziom rekurencji.” Jak mogę to naprawić?
Przenieś polecenia setlocal
i set
przed pętlą. Nie musisz ich wykonywać wiele razy.
Inne rzeczy, które powinny zostać naprawione:
echo pwd=%pwd% >> D:\password.txt
musi 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
endlocal
na końcu pliku
- Zobacz wyjaśnienie poniżej dotyczące używania
setlocal
/endlocal
- Masz miejsce, w
set execute counter=0
którym nie powinno go być
rnd_num
musi być pomiędzy, 0
a 61
nie 0
i 62
(w przeciwnym razie ECHO
hasło jest wstawiane, gdy rnd_num
jest62
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
set pwd=
musi być w pętli. Jest jednak inny (inny) błąd. Odpowiedź poprawiona.ECHO
jakiś czas pojawia się w środku hasła, nppwd=HVc6GH1DWxECHOmPwrjF
. Zauważyłem to, kiedy patrzyłem na twoje poprzednie pytanie. Nie mam pojęcia, dlaczego :(rnd_num=62
. Usuń+1
koniecrnd_num
obliczeń>SET /A rnd_num=!RANDOM! * 62 / 32768
. Odpowiedź zaktualizowana;)