【问题标题】:Batch file choice loop on unexpected input意外输入上的批处理文件选择循环
【发布时间】:2017-08-17 15:10:04
【问题描述】:

所以我有这个选择:

echo.
echo  All done. What would you like to do next?
echo  1. Open output folder
echo  2. Exit
echo.

set /p Choose=" Select 1 or 2 and press Enter: "

if '%Choose%'==1 goto show
if '%Choose%'==2 goto end

问题是,这个脚本检测到除2 之外的任何其他选择为1,这不是我想要的。相反,我希望它在意外输入时循环回choice。互联网告诉我的最接近的事情是:

if '%Choose%'NEQ 1 if '%Choose%'NEQ 2 goto choice

但这取决于任何输入的选择,甚至是12

【问题讨论】:

  • 使用命令choice 而不是set /P,你就没有这个问题了。在命令提示符窗口中运行choice /? 寻求帮助。
  • if 的两边必须相同,== 才会变为真。你已经单引号了第一个,所以你必须单引号第二个。实际上,为了安全起见,请双引号 " 双方。如果两个if 语句都失败,那么做出的选择都不是,所以goto 你的第一个echo。说到choice - 您应该将其视为完成工作的另一种方式。大量关于 SO 的示例 - 只需使用顶行中的 search
  • @Mofi 使用ERRORLEVEL,它在脚本的其他地方使用。我不知道批处理脚本足够好来解决这个问题。
  • @Magoo 成功了,谢谢。您可以将其发布为答案,以便我可以将其设置为这样吗?除非,这将被标记为重复。此外,这是一个我正在尝试为自己定制的现有脚本,所以我没有想出set /p。这是剧本作者选择的。

标签: batch-file choice


【解决方案1】:

if 的两边必须相同才能使 == 为真。你已经单引号了第一个,所以你必须单引号第二个。实际上,为了安全起见,双引号 " 双方。如果两个 if 语句都失败,那么做出的选择都不是,所以转到你的第一个回声。说到选择 - 你应该把它看作是完成工作的另一种方式。很多SO上的示例-只需使用顶行中的搜索框

【讨论】:

  • @GeorgeHovhannisian 请注意,在许多键盘上按 Shift+2 而不是仅按 2 会导致输入 " 字符。因此,如果用户由于 Shift 被按住(或 CapsLock 处于活动状态,具体取决于键盘布局)而错误输入 " 并按下下一个 RETURN,则由于语法错误,批处理文件处理将由 Windows 命令解释器退出,结果为 @ 987654323@ 这是一个无效的命令行。让set /P 输入无法防止用户输入错误真的很难。对于列表中的简单选择,choice 绝对是更好的选择
【解决方案2】:

使用此代码,用户不能按 1 或 2(或 Ctrl+C 中断批处理文件执行)以外的任何内容,并在按下键 1 或 2.

@echo off
echo/
echo  All done. What would you like to do next?
echo/
echo  1. Open output folder
echo  2. Exit
echo/
%SystemRoot%\System32\choice.exe /C 12 /N /M "Select 1 or 2: "
if errorlevel 2 goto :EOF

rem Code to run on open output folder.
echo Use selected 1.

要了解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • choice /?
  • echo /?
  • if /?
  • goto /?
  • rem /?

另请阅读 Microsoft 支持文章 Testing for a Specific Error Level in Batch Files,为什么这里只使用 if errorlevel 2 goto :EOF 就足够了,因为唯一剩下的选项是 errorlevel 在执行 choice 后的值为 1。

另请阅读 DosTips 论坛主题 ECHO. FAILS to give text or blank line - Instead use ECHO/ 为什么使用 echo/ 而不是 echo. 输出空行更好。

另请阅读:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-21
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多