此批处理控制语句第一次不起作用,但第二次起作用

时间:2014-10-15 01:51:32

标签: windows batch-file if-statement label

以下是代码:

:login
    cls
    if exist "%~dp0\Users" (
        set /p enteredusername=Username: 
        if exist %~dp0\Users\%enteredusername%.bat ( call %~dp0\Users\%enteredusername%.bat ) else (
            echo.
            echo That user does not exist.
            echo.
            pause
            goto mainmenu
        )
    ) else (
        echo No accounts exist.
        echo.
        pause
        goto mainmenu
    )
    set /p enteredpass=Password: 
    if %enteredpass%==%password% ( goto begin ) else (
        echo.
        echo Incorrect password.
        echo.
        pause.
        goto mainmenu
    )

因此程序访问User文件夹中的批处理文件。无论用户名是什么,它都会被调用.bat。例如,如果他们注册的用户名是" Bob",则该文件将是Bob.bat。如果该文件存在,请调用它,设置用户名和密码变量。问题是:当我第一次使用此标签并提示输入用户名时,我输入" Bob"。它说这不存在(事实上它确实存在)。不过,这是一个好奇的部分。下次我运行它并键入" Bob",它会提示我输入密码,一切都很棒。它为什么这样做?谢谢。

1 个答案:

答案 0 :(得分:0)

您在同一IF结构中使用%enteredusername%,因为它已定义。整个IF构造被LOADed(解析)为一行。所以如果你要添加一个像

这样的语句
echo.enteredusername=%enteredusername%

在您设置它的'set / p ...'行之后,您会看到该变量为空。您可以启用delayedexpansion,但如果您的用户名或密码有“!”,则会出现问题。在里面。更安全的解决方案是重组这样的东西。显然,并非所有代码都显示在此处。

login
cls
if not exist "%~dp0\Users" (
    echo No accounts exist.
    echo.
    pause
    goto mainmenu
)
set /p enteredusername=Username: 
if exist "%~dp0\Users\%enteredusername%.bat" ( call "%~dp0\Users\%enteredusername%.bat" ) else (
    echo.
    echo That user does not exist.
    echo.
    pause
    goto mainmenu
)
set /p enteredpass=Password: 
if "%enteredpass%"=="%password%" ( goto begin ) else (
    echo.
    echo Incorrect password.
    echo.
    pause.
    goto mainmenu
)