为什么密码生成器不能正常工作?



我想制作一个自动生成密码的批处理文件。下面是我的代码:

@Echo Off
:a
color 0b
Setlocal EnableDelayedExpansion
Set _RNDLength=35
Set _Alphanumeric=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
Set _Str=%_Alphanumeric%987654321
:_LenLoop
IF NOT "%_Str:~18%"=="" SET _Str=%_Str:~9%& SET /A _Len+=9& GOTO :_LenLoop
SET _tmp=%_Str:~9,1%
SET /A _Len=_Len+_tmp
Set _count=0
SET _RndAlphaNum=
:_loop
Set /a _count+=1
SET _RND=%Random%
Set /A _RND=_RND%%%_Len%
SET _RndAlphaNum=!_RndAlphaNum!!_Alphanumeric:~%_RND%,1!
If !_count! lss %_RNDLength% goto _loop
Echo !_RndAlphaNum!
goto a

当我执行它时,我没有得到我想要的结果。

有输出:

1LKoZsi4DEMY8dwQ3xnFGHp1lKEcGsiMIpO
Iz6KsfPIeEqR1lMrx
E3LnXBkXYtpU
vUnDFwMM
UzBao
zYACtvBB
7cWXu
qOKu
ft
hA
lhB
ECHO is off.
KW
jJ
7a
8I
kN
iAy
Ex
ty
ObS
ECHO is off.
1
2
5Z
D
T9x
ECHO is off.
1e
6
ECHO is off.
O
Maximum setlocal recursion level reached.
S
Maximum setlocal recursion level reached.
f
Maximum setlocal recursion level reached.
m
Maximum setlocal recursion level reached.
eQ
Maximum setlocal recursion level reached.
ECHO is off.
Maximum setlocal recursion level reached.
ls
Maximum setlocal recursion level reached.
q
Maximum setlocal recursion level reached.
Lw
Maximum setlocal recursion level reached.
ECHO is off.
Maximum setlocal recursion level reached.
1M
Maximum setlocal recursion level reached.
ECHO is off.
Maximum setlocal recursion level reached.
ECHO is off.
Maximum setlocal recursion level reached.
ECHO is off.
Maximum setlocal recursion level reached.
ECHO is off.
Maximum setlocal recursion level reached.
ECHO is off.
Maximum setlocal recursion level reached.
ECHO is off.
Maximum setlocal recursion level reached.
L
Maximum setlocal recursion level reached.
p
Maximum setlocal recursion level reached.
TR
Maximum setlocal recursion level reached.
sR
Maximum setlocal recursion level reached.
J
Maximum setlocal recursion level reached.
ECHO is off.
Maximum setlocal recursion level reached.
0j
Maximum setlocal recursion level reached.

我该怎么办?

我很难理解你应该做什么。因此,我将编写一些可能与您的目标类似的代码。

此代码创建5个密码,每个密码长35个字符。要改变这种情况,只需将DigitCount和LoopCount修改为所需的值。

@ECHO OFF
SetLocal EnableExtensions EnableDelayedExpansion
SET Digits=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
SET DigitCount=35
SET LoopCount=5
:PWStart
SET "PW=_"
:LoopDigit
SET /A RndIdx=%RANDOM% * 62 / 32768
SET "PW=%PW%!Digits:~%RndIdx%,1!
IF "!PW:~%DigitCount%,1!" == "" GOTO :LoopDigit
ECHO %PW:~1%
SET /A LoopCount-=1
IF %LoopCount% GTR 0 GOTO :PWStart
GOTO :EOF

编辑:谢谢@Mofi,更新代码给建议。

看起来@Mofi的建议不再可见,但我相信它们对那些学习在Windows批处理文件中编程的人有相当大的价值。

  1. SetLocal命令中包含EnableExtensions失败。这适用于我编写的脚本,因为默认情况下已经启用了扩展。但是当向公众展示代码时,有些人会在没有启用扩展的环境中测试代码。这不是一个大的改变,所以它可能是明智的改变这个习惯为我所有的批处理脚本。
  2. 在原始代码中,我使用EQU而不是==,EQU用于数值,其中==用于字符串值。@Mofi在这个答案的三分之二处解释了这一点。

最新更新