批处理文件中的变量和 if 语句存在问题[重复]

Posted

技术标签:

【中文标题】批处理文件中的变量和 if 语句存在问题[重复]【英文标题】:Problem with variables and if statements in a batch file [duplicate] 【发布时间】:2020-02-13 08:22:17 【问题描述】:

我尝试编写一个简单的批处理文件,如下所示:

@echo off
title test file

:menu
set /p foo = Select option (1, 2, 3):
if foo == 1 goto one
if foo == 2 goto two
if foo == 3 goto three

:one
echo One!
goto menu

:two
echo Two!
goto menu

:three
echo Three!
goto menu

写入任何给定选项会将"One!" 写入屏幕并将用户返回到menu 标签。我怀疑错误与我声明的变量类型有关,虽然我不知道,因为我是 Batch 的新手......有什么帮助吗?

【问题讨论】:

如果您从set /p foo=Select.. 中删除了= 之前的空格并将foo == 1 更改为%foo% equ 1 它将起作用,除了担心您仍然需要解决一个人可以仍然键入您此时不适合的任何其他字符。 choice 已内置,只能选择定义的字符 我建议在How to stop Windows command interpreter from quitting batch file execution on an incorrect user input? 上阅读我的答案,它非常详细地解释了set /P 的缺点以及如何确保它的安全以及使用命令choice 对选择菜单进行编码是多么容易,如图所示通过这里已经写的答案。 【参考方案1】:

注意!!不要不要将我的答案标记为正确,因为它几乎与此处的其他答案完全相同,这只是对用法的看法。

无论如何,作为 100% 正确的 @compo 的 答案的补充,我通常不使用 if errorlevel 而直接使用 goto 来缩短它。

@echo off
title test file

:menu
choice /C 123 /M "Select option"
goto label%errorlevel%

:label1
echo One!
goto menu

:label2
echo Two!
goto menu

:label3
echo three!
goto menu

【讨论】:

【参考方案2】:

对于已知的选择不要使用Set /P,而是使用choice

@Echo Off
Title test file

:menu
Choice /C 123 /M "Select option"
If ErrorLevel 3 GoTo three
If ErrorLevel 2 GoTo two

:one
Echo One!
GoTo menu

:two
Echo Two!
GoTo menu

:three
Echo Three!
GoTo menu

如果你想继续使用错误的命令,那么类似这样的东西会更像它:

@Echo Off
Title test file

:menu
Set "foo="
Set /P "foo=Select option [1,2,3]?"
If Not Defined foo GoTo menu
If "%foo%"=="1" GoTo one
If "%foo%"=="2" GoTo two
If "%foo%"=="3" GoTo three
GoTo menu

:one
Echo One!
GoTo menu

:two
Echo Two!
GoTo menu

:three
Echo Three!
GoTo menu

【讨论】:

以上是关于批处理文件中的变量和 if 语句存在问题[重复]的主要内容,如果未能解决你的问题,请参考以下文章

批处理文件中的多行 IF 语句内的变量值未递增 [重复]

我在批处理文件中遇到 if 语句的问题 [重复]

批处理(语句结构)

if语句和变量声明的MSVC语法错误[重复]

无论用户输入如何,我的基于用户输入和 if/else 语句的函数都会给出相同的输出[重复]

如何检查批处理文件中是不是存在文件[重复]