批处理脚本不起作用

时间:2013-08-31 06:29:47

标签: batch-file

我最近批量编写了一个密码脚本。基本上它从不同的批处理脚本中获取密码,找出它有多少个字符,从用户那里获取密码并比较它们。然而,对我来说没有什么是简单的,我已经进入了一些嵌套的FOR循环等。这很难解释,所以这是代码:

@echo off
setlocal enabledelayedexpansion

call pass.bat & rem Sets the variable "pass" as "default".

set map=abcdefghijklmnopqrstuvwxyz
set len=0

for /l %%A in (12,-1,0) do (
        set /a "len|=1<<%%A"
        for %%B in (!len!) do if "!pass:~%%B,1!"=="" set /a "len&=~1<<%%A"
)

for /l %%C in (1,1,100) do (
    set letter%%C=!pass:~%%C,1!
)

:pass
for /l %%D in (0,1,%len%) do (
    cls
    choice /c "abcdefghijklmnopqrstuvwxyz" /n /m "Password: !ast!"
    set /a charerr=!errorlevel!-1
    for /l %%E in (0,1,25) do (
        set password=!password!%map:~!charerr!,1% & rem This is the problem line.
    )
    set ast=!ast!*
)
if "%pass%" neq "%password%" goto fail

cls
echo Correct Password
echo pass: %pass%
echo password: %password%
>nul pause
exit

:fail
set /a tries-=1
if %tries% geq 1 goto pass

现在,脚本不会崩溃或类似,但它不会将password设置为您输入的密码。

如果你运行它,你就会理解。

注意:pass.bat纯粹包含行set pass=default

1 个答案:

答案 0 :(得分:2)

你可以尝试

call set "password=!password!%%map:~!charerr!,1%%"

您的变体无法正常工作,因为当解析时,扩展百分比会扩展,因此%map:~!charerr!,1%会被扩展,但会失败!charerr!当时并没有扩大。

CALL可以在评估该行时开始第二次解析时间,然后双倍百分比将扩展正确。