我找不到解决这个问题的方法,而stackoverflow是我认为唯一可以找到解决方案的地方。我正在创建一个批处理程序来生成随机密码。我希望它有随机数字符和随机字母。这是我用来生成它的脚本 -
set /a rchar=%RANDOM%*8/32768+16
:chargen
set /a charnum=%RANDOM%*36/32768+1
if %charnum%==1 set char='a'
if %charnum%==2 set char='b'
if %charnum%==3 set char='c'
if %charnum%==4 set char='d'
if %charnum%==5 set char='e'
if %charnum%==6 set char='f'
if %charnum%==7 set char='g'
if %charnum%==8 set char='h'
if %charnum%==9 set char='i'
if %charnum%==10 set char='j'
if %charnum%==11 set char='k'
if %charnum%==12 set char='l'
if %charnum%==13 set char='m'
if %charnum%==14 set char='n'
if %charnum%==15 set char='o'
if %charnum%==16 set char='p'
if %charnum%==17 set char='q'
if %charnum%==18 set char='r'
if %charnum%==19 set char='s'
if %charnum%==20 set char='t'
if %charnum%==21 set char='u'
if %charnum%==22 set char='v'
if %charnum%==23 set char='w'
if %charnum%==24 set char='x'
if %charnum%==25 set char='y'
if %charnum%==26 set char='z'
if %charnum%==27 set char='0'
if %charnum%==28 set char='1'
if %charnum%==29 set char='2'
if %charnum%==30 set char='3'
if %charnum%==31 set char='4'
if %charnum%==32 set char='5'
if %charnum%==33 set char='6'
if %charnum%==34 set char='7'
if %charnum%==35 set char='8'
if %charnum%==36 set char='9'
set %char%=%ipassword%
set %fpassword%=%ipassword%%fpassword%
set /a rchar=%rchar%-1
if %rchar%==0 goto :passworddone
goto :chargen
我一直得到"此错误的语法不正确"当试图运行它。有没有人对解决方案有任何想法?非常感谢!谢谢!
答案 0 :(得分:2)
首先,不要在%
语句的左侧使用set
标记。类似的东西:
set fpassword=xyzzy
set %fpassword%=plugh
会将xyzzy
变量设置为plugh
,这是一种间接形式。
应该是:
set fpassword=plugh
其次,实际上有一个相当简洁(虽然棘手)的方法,用cmd
中的变量偏移量和长度来做子串(通常只允许常量),所以不需要所有那些if
语句
诀窍是将set
作为子功能调用。以下脚本:
@echo off
set string=abcdefgh
set ofs=2
set len=3
rem Here be dragons :-)
call set result=%%string:~%ofs%,%len%%%
echo %result%
显示此操作并将输出:
cde
请记住,这是一种零偏移方法,因此在选择要用作索引的随机值时,您不希望将1
添加到变量中。
最后,你的变量操作看起来有些偏差,因为你(例如)试图再次设置char
,无论选择的随机值如何,并且还会对ipassword
做一些折磨。 fpassword
。
考虑到所有这些因素,脚本可以更好地编写为:
@setlocal
@echo off
set /a count = %RANDOM% * 36 / 32768 + 1
set charlist=abcdefghijklmnopqrstuvwxyz0123456789
set password=
:while1
set /a index = %RANDOM% * 36 / 32768
call set char=%%charlist:~%index%,1%%
set password=%password%%char%
set /a count = %count% - 1
if %count% gtr 0 goto :while1
echo %password%
endlocal
您可能需要考虑的其他事项是密码长度。单字符密码是一个非常糟糕的主意,我不确定任何人将记住一个36个字符的密码。密码长度(例如)8到12可能更好:
set /a count = %RANDOM% %% 5 + 8
(并且,是的,%%
是模运算符 - 您可以使用它而不是乘法/除法运算。)