「setlocalの最大再帰レベルに達しました。」どうすれば修正できますか?
ループの前にsetlocaland setコマンドを移動します。これらを複数回実行する必要はありません。
修正すべきその他の事項:
echo pwd=%pwd% >> D:\password.txt移動する必要があります(それ以外の場合、ファイルの最初の行にはpassword=値がありません
setlocal最初に追加(引数なし)
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という変数があり、2番目のスクリプトには異なる変数がありますfile-name(最初のスクリプトとの競合を避けるための別の名前)と呼ばれる3番目のスクリプトにはfile_nameのようなものが必要になりますが、これはすぐに管理が非常に難しくなります。
ローカル変数を使用すると、複数のバッチスクリプトで同じ変数名を自由に使用できます。ローカル変数は他のスクリプトからは見えないため、競合はありません。
ローカル変数は、ENDLOCALコマンドを使用して、あるバッチルーチンから別のバッチルーチンに渡すことができます。
ソースsetlocal-バッチファイル内の環境変数の可視性を制御するオプションを設定します。
参考文献