我想批量制作一个随机字母/数字生成器。我希望它每次执行时生成 1000 次,但我该怎么做才能让它在新行上生成新的随机密码。
例如,如果我打开它 1 次,它会生成 1000 行,每行密码以 0 开头,然后是 9 个随机字母,那么就完成了吗?
答案1
根据您的链接,原始代码如下:
Setlocal EnableDelayedExpansion
Set _RNDLength=9
Set _Alphanumeric=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567899876543210
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 0!_RndAlphaNum! >> your-new-password.txt
我首先会稍微清理一下以保持一致性和提高可读性,然后添加@ECHO OFF
隐藏命令以使其运行干净:
@ECHO OFF
Setlocal EnableDelayedExpansion
SET _RNDLength=9
SET _Alphanumeric=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567899876543210
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!>> your-new-password.txt
顺便说一句,将其放在@
行的前面可以防止该行被回显。由于要关闭整个脚本的回显需要一个将被回显的命令,因此最好将其包含在该行中,这样它本身就不会被回显。希望这是有意义的。
现在开始解决方案。您还需要 2 个变量,一个用于设置密码的最大数量,另一个用于跟踪已创建的密码数量。第一个变量可以在_RNDLength
设置时设置,第二个变量应与第一个变量一起设置。第二个变量应设置为,1
因为在创建密码后,它将递增并进行检查。如果在检查时它不小于最大值(即等于),则脚本将退出。如果我们将其设置为0
,由于这里的样式,我们将有 1001 个密码而不是 1000 个密码。
SET _PwdMax=1000
SET _PwdCount=1
然后在最后的 echo 命令之后,您应该添加一个命令来增加第二个变量和一个 IF 语句,用于检查创建的密码数量是否小于所需的最大密码数量。
SET /a _PwdCount+=1
IF !_PwdCount! LSS %_PwdMax% goto _LenLoop
总的来说,你的代码看起来应该是这样的:
@ECHO OFF
Setlocal EnableDelayedExpansion
SET _RNDLength=9
SET _PwdMax=1000
SET _PwdCount=1
SET _Alphanumeric=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567899876543210
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! >> your-new-password.txt
SET /a _PwdCount+=1
IF !_PwdCount! LSS %_PwdMax% goto _LenLoop
答案2
我提出一个更简单的替代方案
@echo off
setlocal enabledelayedexpansion
set "string=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
set prefix=0
set lines=1000
set chars=9
set outfile=passwords.txt
if exist "%outfile%" del "%outfile%"
for /l %%A in (1,1,%lines%) do (
set "result="
for /L %%i in (1,1,%chars%) do call :addchar
echo %prefix%!result!
echo %prefix%!result! >> %outfile%
)
goto end
:addchar
set /a x=%random% %% 52
set result=%result%!string:~%x%,1!
goto :eof
:end
echo Script finished
pause