Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 此代码不运行,但仅存在。我不确定我在哪里犯了错误_Batch File - Fatal编程技术网

Batch file 此代码不运行,但仅存在。我不确定我在哪里犯了错误

Batch file 此代码不运行,但仅存在。我不确定我在哪里犯了错误,batch-file,Batch File,我希望你能帮助我。所以,我一直在尝试运行这个命令。但每次我这么做的时候,它就退出了。然后,我发现了这个错误.“批处理文件做(在这个时候是意外的)”我不知道我在哪里犯了错误。提前感谢所有的答复 这是我的密码: @echo off for /L %%n in (1,1,3) do ( set uname=mama set pword=mu :xy set /p user ="Enter Username" set /p pass="Enter Pass"

我希望你能帮助我。所以,我一直在尝试运行这个命令。但每次我这么做的时候,它就退出了。然后,我发现了这个错误.“批处理文件做(在这个时候是意外的)”我不知道我在哪里犯了错误。提前感谢所有的答复

这是我的密码:

@echo off
for /L %%n in (1,1,3) do (
    set uname=mama 
    set pword=mu

    :xy
    set /p user ="Enter Username"
    set /p pass="Enter Pass"
    if %uname%==%user% ( echo 
        username is valid ) ELSE (
        echo username not found
        goto xy
    )
    IF %pword%==%pass% ( echo sucess 
    ) ELSE (
        echo invalid password
        goto xy
    )
    pause
    if %%n EQU 3 (echo Run Again)
)

这在评论中详细阐述:

计数器替换
循环,以限制
的尝试


@echo off&&setlocal enabledelayedexpansion
设置“uname=mama”和设置“pword=mu”
:xy
设置/a“\u cnt+=1+0”&设置/p“用户=输入用户名:”
如果没有!\u cnt!eq 3(
如果“!uname!”==“!user!”(echo/Username有效^!!
)else(未找到echo/Username^!!&goto:xy)
设置/p“通过=输入通过:”
如果“!pword!”==”!pass!”(echo/success^!!
)else(回显/无效密码^!!&goto:xy)
)else(再次回显/运行^!!&&%\uuuuuuuuuuuuuuuuuuuuu%timeout-1&endlocal&goto:EOF)
rem/在使用endlocal…&&endlocal&goto:EOFF后,在此处执行更多任务


查看您的代码在我看来,使用
Call
可以解决嵌套标签和延迟扩展问题,并可能使您的代码更易于管理

@Echo关闭
设置“uname=mama”
设置“pword=mu”
设置“用户=”
设置“通过=”
:输入
对于/L%%G In(1,1,3)Do(
电话:xy
如果不是错误1级转到主
)
“%\uuuu AppDir\uuuuu%choice.exe”/M”是否重试
如果不是错误级别2转到输入
退出/B 1
:Main
在下面为成功输入的用户重新输入代码。
回显欢迎%user%。
超时/T 3/NoBreak>NUL
Rem您的代码在这里结束。
退出/b0
:xy
ClS
设置/P“用户=输入用户名>%user%”
如果/I不是“%uname%”,则为“%user%”(
未找到回显用户名。
设置“用户=”
超时/T 2/NoBreak>NUL
退出/B 1
)
Echo用户名是有效的。
设置/P“通过=输入通过>”
如果“%pword%”==“%pass%”退出/B 0
回显无效密码。
设置“通过=”
超时/T 2/NoBreak>NUL
退出/B 1
您可能会注意到,我使用了推荐的语法来使用
Set
命令定义变量。它确保内容受到保护,并且没有隐藏的尾随空格。如果您查看问题中的代码,您会注意到分配给
uname
变量的值实际上是
mama
。当
mama
被锁定在脚本的其余部分之外时,这显然会导致问题

您还注意到,在
echo
username is valid
之间有一个不需要的换行符,而不是空格

编辑


对上述代码进行了重新处理,以允许最多三次尝试正确输入这两个值,尽管
重试
消息似乎有点多余。

您的代码中有一些错误

  • 代码块中不允许使用标签,可能会破坏它们//标签已删除
  • goto
    无条件地中断代码块//左一个
    goto
    以故意离开循环并删除其余部分
  • 您需要使用在同一代码块中更改的变量(技术上不需要
    uname
    pword
    ,正如我在循环外部定义的那样)//启用并使用延迟扩展
  • 您在
    set uname=mama
    //中有一个空格,由推荐的语法
    set“var=value”
  • (安全问题)出于安全原因,您不应该判断是用户名还是密码(或两者都是),这是错误的//修复了(作为奖励,它简化了代码)
  • 修复了上述错误并降低了代码复杂度后,它可能看起来像:

    @echo off
    setlocal enabledelayedexpansion
    set "uname=mama"
    set "pword=mu"
    for /L %%n in (1,1,3) do (
        set /p "user=Enter Username: "
        set /p "pass=Enter Password: "
        if "!uname!-!pword!" == "!user!-!pass!" goto :payload
        echo Invalid username or password.
        pause
    )
    echo sorry, run again.
    goto :eof
    
    :payload
    echo successfully logged in.
    REM rest of your code
    

    (说到安全性:在(可读的)代码中使用明文形式的凭证,任何标准都不安全,但使用纯批处理很难克服)

    在代码块中不允许有标签和没有代码> Goto 。逻辑上:与此相结合,强制用户在执行有效负载之前输入有效凭证三次。“老实说,”Stephan,我甚至没有考虑到意图只允许终端用户三次获得两个EN。请尝试更正。我为我的误解道歉,并已重新编写代码以说明原因。