Condensing If Statement Batch File

冷暖自知 提交于 2019-12-25 06:51:50

问题


I have this batch script that has numerous "if statements". Here are a couple lines of what I have:

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

There are many more possibilities and really could use some simplifying if it is possible. So is there a way I can simplify this? Perhaps something like, if the variable c is equal to any of these exit. Or even make the if statements case insenstitive Is this possible? Really, any way to simplify this would be awesome and could greatly reduce the size of my batch script.

A couple side notes

  • This code already works and does not need to be edited with the exception of condensing it.

  • I know there is a similar question found here, but I do not know how to apply it to my problem.


回答1:


From the HELP for the IF command. The /I switch, if specified, says to do case insensitive string compares. The /I switch can also be used on the string1==string2 form of IF.

if /I %c%==PC exit
if /I %c%==CMD exit
if /I %c%==MENU exit
if /I %c%==KILL exit



回答2:


This is the shortest method:

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
  • The initialization of values variable just needs to made it once, at beginning
  • The !values:/%c%/=! part first replaces the %c% variable; then try to remove such a value enclosed by slashes from !values! variable using Delayed Expansion.
  • If the result is different than the original %values% variable, it means that /%c%/ string appears inside !values!. In this case, execute exit.
  • The /I switch in if command checks for both uppercase and lowercase (and any other letters combination) in %c%.

This method also allows to insert an else part in the if command in the simplest way, because there is just one if.

EDIT: As user LotPings indicated, it is not necessary to include the /I switch in this case because in the %var:old=new% replacement, the old string replacement from %var% value is case insensitive.




回答3:


You can use an array:

set arr=PC pc CMD cmd MENU menu KILL kill
for %%a in (%arr%) do (
if %c%==%%a exit
)

For multiple values, replace the if line with:

if %c%=="PC" if %c%=="pc"

It will only run the next line if all if's are true.



来源:https://stackoverflow.com/questions/42736051/condensing-if-statement-batch-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!