已达到最大 setlocal 递归级别。无法打印超过 30 次?

已达到最大 setlocal 递归级别。无法打印超过 30 次?

我想将一定数量的密码打印到文件中。我在这个网站上找到的代码是 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 递归级别。”我该如何修复它?

setlocalset命令移到循环之前。您不需要多次执行这些命令。

其他需要修复的问题:

  • echo pwd=%pwd% >> D:\password.txt需要移动(否则文件的第一行将password=没有值
  • setlocal在开头添加(不带参数)(否则你的变量将在封闭的 cmd shell 中设置)
  • endlocal在文件末尾添加匹配
  • 请参阅下面有关使用setlocal/的解释endlocal
  • set execute counter=0你有一个不该有的空间
  • rnd_num需要介于0和之间61 不是 0并且62(否则插入ECHO到密码中rnd_num62

这是修复后的批处理文件:

@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 命令将局部变量从一个批处理程序传递到另一个批处理程序。

来源设置本地- 设置选项来控制批处理文件中环境变量的可见性。


进一步阅读

相关内容