我需要Batch的帮助; "命令的语法不正确"

时间:2014-11-14 02:19:17

标签: batch-file

我找不到解决这个问题的方法,而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

我一直得到"此错误的语法不正确"当试图运行它。有没有人对解决方案有任何想法?非常感谢!谢谢!

1 个答案:

答案 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

(并且,是的,%%是模运算符 - 您可以使用它而不是乘法/除法运算。)