batch-file - 批处理 goto 一直给我相同的输出?
问题描述
这是我正在使用的代码:
@echo off
:default
set /p cmd= "1 or 2"
if %cmd%=="1" goto one
if %cmd%=="2" goto two
:one
echo "1 worked"
goto default
:two
echo "2 worked"
goto default
但是,无论我输入什么,我得到的输出都是“1工作”。有谁知道我做错了什么?
解决方案
您的问题是您忽略了双引号。除非最终用户输入"1"
或"2"
比较的双方==
永远不会匹配,否则您的代码将始终使两个if
命令都失败并继续执行:one
. 解决方法是确保比较的两边都是双引号。
这向您展示了它应该如何工作,但请注意,最终用户可以在提示符下输入他们想要的任何内容,因此您应该在尝试使用该输入之前从技术上执行一些验证。最好的方法是改用更健壮的输入法,例如choice
命令
此示例使用您不推荐的Set /P
方法:
@Echo Off
:default
Set "num="
Set /P "num=1 or 2"
If "%num%" == "2" GoTo two
If Not "%num%" == "1" GoTo default
Echo "1 worked"
GoTo default
:two
echo "2 worked"
GoTo default
请注意,我将您的变量名从 更改为cmd
,因为使用命令名作为变量名会造成混淆。
这将使用推荐的Choice
命令:
@Echo Off
:default
"%__AppDir__%choice.exe" /C 12
If ErrorLevel 2 GoTo two
Echo "1 worked"
GoTo default
:two
Echo "2 worked"
GoTo default
或者,您可以使用错误级别作为您的GoTo
:
@Echo Off
:default
"%__AppDir__%choice.exe" /C 12
GoTo Label%ErrorLevel% 2>NUL||GoTo default
:Label1
Echo "1 worked"
GoTo default
:Label2
Echo "2 worked"
GoTo default
推荐阅读
- visual-studio - 每行执行两次
- java - 如何在 Spring Boot 中从端点响应中全局省略空 xml 标记?
- reactjs - Jest 测试回调
- mysql - SQL 关系除法查询
- razor - 在 Blazor 页面中使用 SVGS
- javascript - Angular 7过滤器下拉值
- c# - Gmail API:使用包含变音符号的邮件地址会导致 SMTPEception:客户端或服务器仅配置为具有 ASCII 本地部分的地址
- makefile - 为什么我的 makefile 永远不会停止构建?
- javascript - MS Edge 随机不加载脚本
- node.js - Swagger 模块中的前缀 url