我有一个批处理脚本,可以生成一个长度为 75 位的随机密码字符串。当密码字符串以某个0
值开头时,我设置的其他自动化部分会变得不稳定。我需要一种方法来识别随机密码字符串中的第一个数字是否为零。
我的计划如果该字符串的第一个字符是 a,则拒绝该字符串0
并生成新密码。
笔记:我找到了几个解决方案,但都是针对少于 75 位数字的小字符串。
批处理文件
@Echo off&SetLocal EnableExtensions EnableDelayedExpansion
set execute counter=0
:loop
Set "Chars=1234567890"
Set CharsCnt=10
Set "Pass="
For /L %%c in (1,1,75) do (
Set /a Pnt=!Random! %% CharsCnt
Call Set "Pass=!Pass!%%Chars:~!Pnt!,1%%"
)
Echo Password is:%Pass%
start "" https://check.pass/%pass%
goto loop
输出
无领先
0
115792089237316195423570985008687907852837564279074904382605163141518161495
带有前导
0
(自动化变得不稳定)011579208923731619542357098500868790785283756427907490438260516314151816149
答案1
“如果字符串中有前导 0,则拒绝输出并重新计算随机字符串”
因为您说您想要识别密码字符串的第一个字符,并且如果第一个数字等于0
,则生成另一个随机密码字符串,所以我提供了一个您可以在下面使用的解决方案。
本质上这将...
@Echo off&SetLocal EnableExtensions EnableDelayedExpansion
set execute counter=0
:loop
Set "Chars=1234567890"
Set CharsCnt=10
Set "Pass="
For /L %%c in (1,1,75) do (
Set /a Pnt=!Random! %% CharsCnt
Call Set "Pass=!Pass!%%Chars:~!Pnt!,1%%"
)
if [%Pass:~0,1%]==[0] goto :loop
Echo Password is:%Pass%
echo start "" https://check.pass/%pass%
goto :loop
笔记: 您可以在 if 语句中使用任何逻辑,而不是 goto :loop
如果值相等,则执行任何操作 0
—我用了 if [%Pass:~0,1%]==[0] goto :loop
假设这就是您所需要的,因为如果您只是希望批处理重新生成没有前导零的字符串,那么如果它从字符串中删除前导零,则不清楚您希望它做什么。0
从字符串中删除前导也是可能的,但我不确定字符串是否有字符长度要求或其他什么,因为您说您希望它重新生成字符串,这似乎是最简单的解决方案。
更多资源
答案2
我能想到的最简单的解决方案:从 1-9 中生成一位数字,然后从 0-9 中生成另外 74 位数字。
答案3
碰巧的是,字符串替换恰好有你想要的东西......所以你很幸运,不需要成为一个大批量专家来做到这一点。
批量字符串替换描述于set /?
!
C:\Users\user>set /?
........
Environment variable substitution has been enhanced as follows:
%PATH:str1=str2%
would expand the PATH environment variable, substituting each occurrence
of "str1" in the expanded result with "str2". "str2" can be the empty
string to effectively delete all occurrences of "str1" from the expanded
output. "str1" can begin with an asterisk, in which case it will match
everything from the beginning of the expanded output to the first
occurrence of the remaining portion of str1.
........
C:\Users\user>set z=0000123
C:\Users\user>set z=%z:*0=% & echo %z%
0000123
C:\Users\user>set z=%z:*0=% & echo %z%
000123
C:\Users\user>set z=%z:*0=% & echo %z%
00123
C:\Users\user>set z=%z:*0=% & echo %z%
0123
C:\Users\user>set z=%z:*0=% & echo %z%
123
C:\Users\user>
因此,如果您运行一行,set z=123
然后运行一行z=%z:*0=%
多次(例如 80 次),那么它将删除多达 80 个前导零,这足以覆盖可能属于字符串 75 位数字的所有前导零。
在批处理文件中,就像在您的批处理文件中一样,您必须使用!var!
(用于扩展变量和%%
(用于字符串替换,而不是%var%(用于扩展变量)和%(用于字符串替换),因此,就像您的批处理文件已经做的那样,以及像您的批处理文件一样的顶行与setlocal及其后续内容。所以你的批处理文件已经有了。