【问题标题】:What is wrong with this batch script这个批处理脚本有什么问题
【发布时间】:2015-01-02 08:38:46
【问题描述】:

我开始接触编程,最近学习了批处理脚本的基础知识。我正在做一些私人的事情,但是每当我尝试使用我放入“set/p”的输入时,它就会退出批处理。 我想知道是不是有什么问题

set /p msg=
if %msg%== y goto :y1
if %msg%== n goto c1
:y1
cls
color 0a

在此之前和之后只有“回声”和文字

提前致谢

【问题讨论】:

  • 你是用“双击”开始的吗?如果是,则该窗口将在批处理文件结束后立即消失。在脚本末尾使用pause 使其保持打开状态并读取输出。
  • 删除每个== 后面的空格。正确的语法是if "string"=="string" do stuff。有关更多信息,请在控制台窗口中查看 help if
  • @rojo help if 中呈现的语法是文体问题,而不是语义问题。 == 周围的空格很好。如果用户没有输入任何内容,您需要将 %msg% 括在引号中以防止出现问题。如果你在 lhs. 周围加上引号,你还需要在 rhs 周围加上引号。 (即"y")。

标签: batch-file


【解决方案1】:

比较时应在项目周围使用引号,例如:

if "%msg%" == "y"

【讨论】:

  • 批处理脚本中的空格很重要。去掉==两边的空格。
  • @rojo 虽然空白在批处理脚本的许多地方都很重要,但绝对没有必要删除 == 周围的空白(试试看!)。
  • 有关此问题的说明,请参见此处:stackoverflow.com/a/27489844/2152082
【解决方案2】:

现在不在我的电脑上,但有四件事要检查/尝试。

  1. 使用IF /i,这样即使您输入大写字母也能正常工作。 (http://ss64.com/nt/if.html)

  2. 正如thebjorn所说,在变量和值周围使用“”很好。

  3. 您的示例看起来可能在 %msg% 之后缺少一个空格

  4. 仅根据您所包含的代码,最可能的问题是斯蒂芬所说的...在示例代码中,一旦到达 :y1 标签将清除屏幕,设置颜色,然后超快速地回显并退出。 试试暂停技巧。

【讨论】:

    【解决方案3】:

    感谢您的回答,但我已经想通了。 我尝试了不同的更改,然后我终于明白了

    我只需要将 GOTO 大写

    @echo off
    @echo [question] [message] y/n?
    set /p msg=
    if %msg%== y GOTO :y1
    if %msg%== n GOTO c1
    :y1
    cls
    color 0a
    

    【讨论】:

    • uhm - 批处理命令不区分大小写。仅仅大写'goto'绝对没有帮助。你肯定有不同的错误。
    【解决方案4】:
    set /p msg=
    if %msg%== y goto :y1
    if %msg%== n goto :c1
    :y1
    cls
    color 0a
    

    我相信你的错误将是你的开始。如果你有set /p msg=,这将有 %msg% 等于任何内容,如果你的批处理程序以错误开始,那么它将立即关闭。 你可以让它等于你想要的任何东西,例如,如果你想让它是空白的,你必须有:set /p msg=" " 并且在命令提示符中它只会将你的光标带到一个空白行等待你的输入。

    最标准的选项是命令提示符用来指示新行:set /p msg=" > "

    我为您编辑了代码,您可以根据需要更改它...我也为您清理了一些外观

    @echo off
    
    echo input y or n
    echo.
    set /p "msg= > "
    if "%msg%"=="y" goto :y1
    if "%msg%"=="n" goto :c1
    :y1
    cls
    color 0a
    pause
    

    编辑 1: 在上面的代码中修复了我的引号......原来的放置不会对上面的内容做太多,但如果使用附加代码,它可能会导致问题,当涉及到引号和空格批处理有点挑剔

    附注 1:如果您想要定时暂停而不是在暂停时等待按钮按下,您可以使用命令 timeout /t # # 将是你希望它等待几秒钟,你也可以按任何按钮让它像暂停按钮......现在就像暂停按钮有“按任意键继续......”短语所以超时它有一些东西像这样,但不要在这个“按任意键继续或等待#...”中引用我的话,您可以隐藏这些短语,但使用以下任一代码行:pause >nultimeout /t # >nul

    【讨论】:

    • 批处理脚本中的空格很重要。删除每个== 后面的空格。
    • @rojo 是的,你是对的,错误是我的错。谢谢你指出我现在已经修好了。
    • @Stephan 是的,但我见过或使用过它的每一种方式,它一直是set /p "var"=" ",或者因为只使用了一个空格,你可以像@987654331 一样写它@... 你是对的 `set /p var= 工作正常,但你必须考虑有时会多么挑剔批次,以后可能会添加其他东西并将其搞砸。
    • @MackuliN 语法是:set /p variable=<prompt> 可以是任何东西,包括为空; set /p "var=input: " 只是在屏幕上看起来比没有空间更好。
    猜你喜欢
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 2015-05-24
    相关资源
    最近更新 更多