2013-08-31 2 views
1

최근 일괄 적으로 비밀번호 스크립트를 작성했습니다. 기본적으로 다른 배치 스크립트에서 암호를 가져 와서 얼마나 많은 문자가 있는지 알아 내고 사용자로부터 암호를 받아 비교합니다. 그러나, 나와 함께 단순한 것은 없으며 몇 가지 중첩 된 FOR 루프 등을 들었습니다. 그러나 당신이 입력 한 암호로 password를 설정하지 않습니다,일괄 처리 스크립트가 작동하지 않습니다.

@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 

지금, 스크립트가 충돌하거나 그런 아무것도하지 않습니다 : 그것은 설명하기 어려운, 그래서 여기에 코드입니다.

실행하면 이해할 수 있습니다.

참고 : pass.bat 순전히 당신은 시도 할 수 set pass=default

답변

2

라인을 포함

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

귀하 %의 확장이 블록은 을 구문 분석 할 때 확장대로 작동하지 않을 수 변형, 그래서 %map:~!charerr!,1%은 확장되지만! charerr! 그 때 확장되지 않습니다.

CALL은 줄을 평가할 때 두 번째 구문 분석 시간을 시작할 수 있으며 이중 퍼센트는 올바르게 확장됩니다.

+0

솔루션을 제공해 주셔서 감사합니다. 그러나 처음으로 int를 사용할 필요가 없기 때문에 중첩 된 for 루프도 제거해야했습니다. –

관련 문제