1

我最近批量编写了一个密码脚本。基本上,它从不同的批处理脚本中获取密码,找出它有多少个字符,从用户那里获取密码并进行比较。然而,对我来说没有什么是简单的,我已经进入了一些嵌套的 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

4

1 回答 1

2

你可以试试

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

您的变体无法工作,因为在解析块时会扩展百分比扩展,因此%map:~!charerr!,1%将扩展,但失败为 !charerr! 当时没有展开。

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

于 2013-08-31T06:37:56.177 回答