setlocalの最大再帰レベルに達しました。30回以上印刷できませんか?


1

定義された数のパスワードをファイルに印刷したい。私がこのサイトで見つけたコードは、私が見るように30ループ用に作られており、もっと多く、たとえば1000を印刷したいと思っています。「setlocalの最大再帰レベルに達しました。」どうすれば修正できますか?

@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

「setlocalの最大再帰レベルに達しました。」どうすれば修正できますか?

ループの前にsetlocaland setコマンドを移動します。これらを複数回実行する必要はありません。

修正すべきその他の事項:

  • echo pwd=%pwd% >> D:\password.txt移動する必要があります(それ以外の場合、ファイルの最初の行にはpassword=値がありません
  • setlocal最初に追加(引数なし)
  • endlocalファイルの末尾に一致を追加します
  • setlocal/の使用に関する以下の説明を参照してくださいendlocal
  • set execute counter=0そこにあるべきではないスペースがあります
  • rnd_num間にする必要がある061 ない 062(そうでない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-バッチファイル内の環境変数の可視性を制御するオプションを設定します。


参考文献


理由は、setlocalがそのように置かれたと思います。スクリプトが壊れただけで、生成パラメーターを尊重しません。PWD = 6k4BjpSkCjFhuSOtaのPWD = zmjUzgpgwD3gQnylCそして、これが今何をするかです::PWD = oHxgUX7HN2lSLXeyH PWD = oHxgUX7HN2lSLXeyHHrjdsC0vTex93tH1M PWD = oHxgUX7HN2lSLXeyHHrjdsC0vTex93tH1MKI0ZP5nJj7VgwFEPN PWD = oHxgUX7HN2lSLXeyHHrjdsC0vTex93tH1MKI0ZP5nJj7VgwFEPNywaE8dzVEgVnwBvMR PWD = oHxgUX7HN2lSLXeyHHrjdsC0vTex93tH1MKI0ZP5nJj7VgwFEPNywaE8dzVEgVnwBvMRJB8xZYWDp3GBx6SiECHOこれは、パスワードを生成する方法です。最初に生成されたものに追加さ
Unix

1
@Unix謝罪、私の間違いset pwd=はループ内にある必要があります。ただし、別の(異なる)エラーがあります。回答が修正されました。
DavidPostill

1
私が気づいていない別の問題があります。これはECHO、たとえばパスワードの途中にあることがよくありますpwd=HVc6GH1DWxECHOmPwrjF。私はあなたの前の質問を見ているときに気づきました。なぜかわからない:(
DavidPostill

1
それを見つけた。それは時にのみ起こりrnd_num=62ます。計算+1の最後からを削除しrnd_numます> SET /A rnd_num=!RANDOM! * 62 / 32768。回答が更新されました;)
DavidPostill

1
@Unixはい、長さ16のパスワードの場合は15に変更します。好きなだけ大きなパスワードを生成します(ただし、あまりにも多くのことを試みますが、時間がかかりすぎます)。101文字の(0、1、100)で動作しています。
DavidPostill
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.