2

我和我的朋友很无聊,所以我们决定在 BATCH 中进行一些编码,并制作了一个基本的登录脚本。基本上,当您以用户身份输入“Jack”时,它会要求输入密码,如果您输入“Pass”,即使不应该输入,它也会显示不正确。奇怪的是,如果你输入了错误的密码,它就说它是正​​确的。

这是我的代码

@echo off
color 2
:A
cls
echo Welcome, Please Log In
set /p user=Please Enter A Username:
IF "%user%"=="Jack" (
    set /p pass=Please Enter A Password:
    IF "%pass%"=="Pass" (
        goto :B
    ) ELSE (
        echo Password Incorrect
        ping 192.0.2.2 -n 1 -w 2000 > nul
        goto :A
    )
) ELSE (
    echo Username Incorrect
    ping 192.0.2.2 -n 1 -w 2000 > nul
    goto :A
)
:B
cls
echo Hello %user%
:C
set /p cmd="%user%> "
if "%cmd%"=="exit" (
    goto :EXIT
) ELSE (
    echo Invalid Command.
    goto :C
)
:EXIT
exit
4

3 回答 3

4

问题是%pass%在行的扩展IF "%pass%"=="Pass" (
这失败了,因为在解析完整块时发生百分比扩展,甚至在执行一行之前。

因此存在一种称为延迟扩展的模式,该模式将在执行的那一刻进行扩展。

@echo off
setlocal EnableDelayedExpansion
...
IF "%user%"=="Jack" (
    set /p pass=Please Enter A Password:
    IF "!pass!"=="Pass" (
于 2013-11-05T20:19:10.150 回答
2

需要延迟扩展

看国旗setlocal /?EnableDelayedExpansion

于 2013-11-05T20:18:21.097 回答
0

好吧,我不知道 EnableDelayedExpansion 是什么东西,但我设法修复它,而不是在 if 语句中放入 if 语句我这样做了

title Some OS 1.0v
@echo off
color 2
:A
cls
echo Welcome, Please Log In
set /p user="Please Enter A Username: "
IF "%user%"=="Jack" (
    set /p pass="Please Enter A Password: "
    goto CheckPass
) ELSE (
    echo Username Incorrect
    ping 192.0.2.2 -n 1 -w 2000 > nul
    goto A
)
:CheckPass
IF "%pass%"=="Pass" (
    goto B
) ELSE (
    echo Password Incorrect
    ping 192.0.2.2 -n 1 -w 2000 > nul
    goto A
)
:B
cls
echo Hello %user%
:C
set /p cmd="%user%> "
if "%cmd%"=="exit" (
    goto EXIT
) ELSE (
    goto cmd
)
:cmd
if "%cmd%"=="cmd" (
    echo cmd : Shows list of commands
    echo exit : Exits the program
    goto C
) ELSE (
    echo Invalid Command, For list of commands type "cmd".
    goto C
)
:EXIT
exit
于 2013-11-05T20:36:06.357 回答