我想将一定数量的密码打印到文件中。我在这个网站上找到的代码是 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 递归级别。”我该如何修复它?
将setlocal
和set
命令移到循环之前。您不需要多次执行这些命令。
其他需要修复的问题:
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_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 的变量,第二个脚本有一个名为 file-name 的不同变量(不同的名称以避免与第一个脚本冲突),第三个脚本现在需要类似 file_name 的东西,这很快就会变得很难管理。
使用局部变量,您可以自由地在多个批处理脚本中使用相同的变量名 - 不会发生冲突,因为局部变量对任何其他脚本都不可见。
可以使用 ENDLOCAL 命令将局部变量从一个批处理程序传递到另一个批处理程序。
来源设置本地- 设置选项来控制批处理文件中环境变量的可见性。
进一步阅读
- Windows CMD 命令行的 AZ 索引- 与 Windows cmd 行相关的所有事物的绝佳参考。
- 设置本地- 设置选项来控制批处理文件中环境变量的可见性。