我最近批量编写了一个密码脚本。基本上它从不同的批处理脚本中获取密码,找出它有多少个字符,从用户那里获取密码并比较它们。然而,对我来说没有什么是简单的,我已经进入了一些嵌套的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
答案 0 :(得分:2)
你可以尝试
call set "password=!password!%%map:~!charerr!,1%%"
您的变体无法正常工作,因为当解析时,扩展百分比会扩展,因此%map:~!charerr!,1%
会被扩展,但会失败!charerr!当时并没有扩大。
CALL
可以在评估该行时开始第二次解析时间,然后双倍百分比将扩展正确。