2013-02-20 29 views
0

我有一个windows批处理文件,它解码我的密码(没有narky注释它只是为了看到somthing如何工作)。需要循环一个批处理文件中的无限字符的进程

从一个没有问题的文件读取密码,但即时尝试现在解码它,除了我不知道如何适应未知密码字符长度的事实,我将没有问题。

以下工作,但只限于有限数量的字符我怎样才能为未知的(无限制)大小的密码编程somthing?

如果你想知道为什么〜0,2,因为字母表中的每个字母都用一个双倍的数字字符集表示,例如00表示A或01表示B是在我建立的另一个程序中随机生成的。

IF %MYPASSWORD:~0,2% == %AA% msg * first letter is A 
IF %MYPASSWORD:~0,2% == %BB% msg * first letter is B 
IF %MYPASSWORD:~0,2% == %CC% msg * first letter is C 
IF %MYPASSWORD:~0,2% == %DD% msg * first letter is D 
IF %MYPASSWORD:~0,2% == %EE% msg * first letter is E 
IF %MYPASSWORD:~0,2% == %FF% msg * first letter is F 
IF %MYPASSWORD:~0,2% == %GG% msg * first letter is G 
IF %MYPASSWORD:~0,2% == %HH% msg * first letter is H 
IF %MYPASSWORD:~0,2% == %II% msg * first letter is I 
IF %MYPASSWORD:~0,2% == %JJ% msg * first letter is J 
IF %MYPASSWORD:~0,2% == %KK% msg * first letter is K 
IF %MYPASSWORD:~0,2% == %LL% msg * first letter is L 
IF %MYPASSWORD:~0,2% == %MM% msg * first letter is M 
IF %MYPASSWORD:~0,2% == %NN% msg * first letter is N 
IF %MYPASSWORD:~0,2% == %OO% msg * first letter is O 
IF %MYPASSWORD:~0,2% == %PP% msg * first letter is P 
IF %MYPASSWORD:~0,2% == %QQ% msg * first letter is Q 
IF %MYPASSWORD:~0,2% == %RR% msg * first letter is R 
IF %MYPASSWORD:~0,2% == %SS% msg * first letter is S 
IF %MYPASSWORD:~0,2% == %TT% msg * first letter is T 
IF %MYPASSWORD:~0,2% == %UU% msg * first letter is U 
IF %MYPASSWORD:~0,2% == %VV% msg * first letter is V 
IF %MYPASSWORD:~0,2% == %WW% msg * first letter is W 
IF %MYPASSWORD:~0,2% == %XX% msg * first letter is X 
IF %MYPASSWORD:~0,2% == %YY% msg * first letter is Y 
IF %MYPASSWORD:~0,2% == %ZZ% msg * first letter is Z 

不错的原因这只包括第一个字符。如果我有例如100个字符,我将不得不做超过100次以上,如果我有1000 1000倍以上(我认为这是理想的循环,但我总是有麻烦与他们)

总之即时试图循环到%MYPASSWORD:如果密码中有1000个字符,则为〜998:2%,如果有100万个字符,则为%MYPASSWORD:〜99998:2%。显然没有人编码该数额

回答

1

如果您反转字符映射变量的定义,您的工作变得更容易。您使用该字母作为名称和代码作为值。我将使用名称中的代码,并将字母作为值。该名称应该以一个非数字字符作为前缀,以便解析器不会将%17%%1参数混淆。

例如,当你可能定义set AA=21,我将定义set map21=A

一批可变的长度并不是无限的 - 的最大长度是8192个字符。除以2,并且你有最大数量的循环。 FOR/L命令是一个快速循环结构。

您也将受益于使用延迟扩展。

这里是如果采用上述建议所有需要:

setlocal enableDelayedExpansion 
set "decodedPassword=" 
for /l %%N in (0 2 8191) do (
    for /f "delims=" %%C in ("!MYPASSWORD:~%%n,2!") do (
    set "decodedPassword=!map%%C!" 
) 
) 

上面的代码可以进一步优化。例如,浪费时间在处理最后一个代码后继续寻找更多代码。但在你的情况下,浪费的时间可能无关紧要。