当我使用此代码从我的列表中选择一个字符时,它工作得很好但是当我使用以下代码将其写入文件时:
echo %pwd%>>pwd.gen
有时会在生成的字符串中间随机放置“ECHO”这个词。这是一个例子:
jUrkunjcxC
ecRECHOsI5w0T
DmJfat13fT
UWXOysW7Gb
pPmS7138Ve
nFkh32ECHOJd1
你可以看到它出现在第2行和第6行。这只发生在大约20%的时间。
以下是代码:
@echo off
title Password Generator
color f0
:firstRun
set /a cnt=0
cls
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
set /p Len=What length should the password be?
set /a Len=%Len%-1
cls
set /p Amt=How many would you like to generate?
cls
goto start
:start
set alfanum=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
set pwd=
FOR /L %%b IN (0, 1, %Len%) 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.gen
set /a cnt=%cnt%+1
if %cnt%==%Amt% goto end
goto start
:end
cls
echo Done!
echo Results have been saved to "pwd.gen"
echo.
choice /c YN /m "Restart?"
if %errorlevel%==1 goto firstRun
答案 0 :(得分:1)
这是几件事的组合。虽然我并不完全清楚整个事情的内部运作,但我知道是什么导致它以及如何解决它。
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
长度为62个字符。 但是,批处理中的子串从0开始,因此有效数字从0到61.无论出于何种原因,索引超出范围与^
'echo %%alfanum:~!rnd_num!^,1%%'
相结合导致显示单词ECHO
。
要解决这个问题,在计算rnd_num时,不要添加1。
SET /A rnd_num=!RANDOM! * 62 / 32768
答案 1 :(得分:1)
:start
set alfanum=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
set pwd=
FOR /L %%b IN (0, 1, %Len%) DO (
SET /A rnd_num=!RANDOM! * 62 / 32768 + 1
for /F %%c in ('echo %%alfanum:~!rnd_num!^,1%%') do set pwd=!pwd!%%c
)
rnd_num
设置为62
/F %%c
命令索引alfanum:~62,1~
,这是一个空字符串echo
没有参数,打印ECHO is on.
而不是返回单个字符for /F
默认使用空格分隔符拆分字符串,用于分隔第一个单词%%c
变为ECHO
ECHO
添加到密码中。