我有这个批处理脚本有很多" if语句"。以下是我的几行内容:
if %c%==PC exit
if %c%==pc exit
if %c%==CMD exit
if %c%==cmd exit
if %c%==MENU exit
if %c%==menu exit
if %c%==KILL exit
if %c%==kill exit
还有更多的可能性,如果有可能的话,真的可以使用一些简化。那么有什么办法可以简化这个吗?也许类似的事情,如果变量c
等于其中任何一个退出。或甚至使if语句不明确这是否可能?实际上,任何简化此操作的方法都很棒,可以大大减小我的批处理脚本的大小。
一些附注
此代码已经有效,除了缩小代码外无需编辑。
我知道here发现了一个类似的问题,但我不知道如何将其应用到我的问题中。
答案 0 :(得分:6)
这是最短的方法:
rem Next line is necessary to nest the value of one variable inside another one
setlocal EnableDelayedExpansion
rem Initialize the list of values enclosed by slash
set "values=/PC/CMD/MENU/KILL/"
if /I "!values:/%c%/=!" neq "%values%" exit
values
变量的初始化只需要在开始时进行一次!values:/%c%/=!
部分首先替换%c%
变量;然后尝试使用Delayed Expansion从!values!
变量中删除斜杠所包含的值。%values%
变量的不同,则表示/%c%/
字符串 !values!
内显示。在这种情况下,请执行exit
。/I
命令中的if
开关检查%c%
中的大写和小写(以及任何其他字母组合)。此方法还允许以最简单的方式在else
命令中插入if
部分,因为只有一个if
。
编辑:正如用户LotPings指出的那样,在这种情况下没有必要包含/I
开关,因为在%var:old=new%
替换中,old
字符串从%var%
值替换不区分大小写。
答案 1 :(得分:2)
来自IF
命令的帮助。 / I开关,如果指定,表示要进行不区分大小写的字符串比较。 / I开关也可以用于IF的string1 == string2形式。
if /I %c%==PC exit
if /I %c%==CMD exit
if /I %c%==MENU exit
if /I %c%==KILL exit
答案 2 :(得分:1)
您可以使用数组:
set arr=PC pc CMD cmd MENU menu KILL kill
for %%a in (%arr%) do (
if %c%==%%a exit
)
对于多个值,请将if
行替换为:
if %c%=="PC" if %c%=="pc"
如果所有if
都为真,它只会运行下一行。