bat编程扫雷:多选复合if...else语句

运行环境:

Windows 10 专业版

if_else语句多选复合语句问题

1.单条语句的嵌套

1.a

如这样一段简单的复合选择语句,是无法通过运行的。

if_else常见错误.png
1.b

当我们为每条语句加上 () 小括号时,它依然是无法正常运行。

if_else常见错误2.png
1.c

这是因为 if 和 else 条件后的执行语句,只能做一条语句看待。

if %option% == 3 ( echo three ) else if %option% == 2 ( echo two ) else if %option% == 1 ( echo one ) else ( echo zero )
if_else语句视为一行.png
1.d

实际编程中,如果我们的需求较大,选项多、语句代码长时,所有if_else嵌套语句写在了一行,即影响了可读性,也提高了维护难度。我们不大可能编写这样一行代码。

由于产生了换行,我们需要在每条条件执行语句结尾的 后面加上 ^,以充当续行的作用。

set option=2
if %option% == 3 ( echo three ) ^
else if %option% == 2 ( echo two ) ^
else if %option% == 1 ( echo one ) ^
else ( echo zero )
if_else常见错误3.png

2.多条逻辑语句的多选复合语句

2.a

上述通过添加 ^ 的形式,确实解决了多层嵌套的问题。但是对于多条语句的执行情况,又是不同。
我们可以看到,进入第二行的条件里,它把后面的赋值语句,当字符串输出了。如果是更复杂的语法,而不是例子中第一条语句是echo,就会看到语法错误。

if_else常见错误4.png

这时,我们需要把两条语句分行编写,才能保证程序的正确运行。
到了这里,可能会有熟悉C/C++编程习惯的朋友,会编写这样if_else格式的语句:

if (option == 2) 
{
  //
}
else if (option == 1)
{
  //
}
else 
{
  //
}

又或者是Java的编程习惯的形式:

if (option == 2) {
  //
} else if (option == 1) {
  //
} else {
  //
}
2.b

我们先看下C/C++编写习惯的if_else语句:
程序运行到第一个条件语句就已经报错。这就是因为 if 条件后的操作都视为一条语句。


if_else常见错误5.png
2.c

我们在每个if后面加上续行操作符 ^ 后,我们并不能得到想要的运行结果。
我的一个理解是,续行操作符只将下一行语句前置到同行,由于读到下一行没有语句,就依照程序逻辑往下运行。这时就出现了我们一般在C/C++、Java等语言没出现过的一种情况。嵌套在if_else语句中间的语句被执行了。观察结果,我们可以看到每条echo语句都有执行,并且执行的4次sum赋值,显示的就是最后一次赋值为0的执行结果。这是bat脚本的第一个很神奇的语法特点。
这个续行操作符跳过空的一行语句,继续执行了正确的语句,找到了else时,判断到前面有if语句,并不认为是语法错误,就继续往下执行。

if_else常见错误6.png

2.d

这样添加续行操作符的动作,没有识别到条件语句后的逻辑是一个代码块。我们尝试直接将每个条件语句后的语句块的左括号 ( 前置到与if语句同一行的后面,我们却得到了正确的结果:

setlocal EnableDelayedExpansion
set option=2
set sum=-1
if %option% == 3 ( 
  echo three 
  set /a sum=%option%*%option%*%option%
) ^
else if %option% == 2 ( 
  echo two 
  set /a sum=2*%option%
) ^
else if %option% == 1 ( 
  echo one 
  set /a sum=%option% 
) ^
else ( 
  echo zero 
  set /a sum=0 
)
echo sum = !sum!
if_else常见错误7.png

至此,我们确实得到了正确的运行结果。不过我们还是想要验证,类似C/C++编程习惯格式的语句。回退到2.c的操作上,继续做修改。
我们先排除几种修改的可能:

  • 右括号后面的续行操作符 ^ 不会删除。这是第1大点得出的结论。
  • 不会在每一行代码后加续行操作符 ^ ,这与2.a的错误结论相等。
2.e

在每一行代码后加续行操作符。
结论不理想,这样的操作更像是一个多行输出的操作。


if_else常见错误8.png
2.f

在上面的基础上,在每个左括号 ( 后面加续行操作符。
结论更不理想,没有一条语句有执行到。

if_else常见错误9.png

2.g

在2.c的基础上,只做在每个左括号 ( 后面加续行操作符的动作。
结论依然是错误的。

if_else常见错误10.png

正确的写法

至此,我们没有得到类似C/C++编写习惯的if_else格式的正确写法,但是有2.d这样的结论:

  • if 语句与左括号 ( 同行
  • 右括号 ) 不与 else if 同行
  • 右括号 ) 后面加上续行操作符 ^
setlocal EnableDelayedExpansion
set option=2
set sum=-1
if %option% == 3 ( 
  echo three 
  set /a sum=%option%*%option%*%option%
) ^
else if %option% == 2 ( 
  echo two 
  set /a sum=2*%option%
) ^
else if %option% == 1 ( 
  echo one 
  set /a sum=%option% 
) ^
else ( 
  echo zero 
  set /a sum=0 
)
echo sum = !sum!
2.h.Java编写习惯的写法

我们也很清楚地看到,这种编写习惯也是正确的。

setlocal EnableDelayedExpansion
set option=2
set sum=-1
if %option% == 3 ( 
  echo three 
  set /a sum=%option%*%option%*%option% 
) else if %option% == 2 ( 
  echo two 
  set /a sum=2*%option% 
) else if %option% == 1 ( 
  echo one 
  set /a sum=%option% 
) else ( 
  echo zero 
  set /a sum=0 
)
echo sum = !sum!
if_else常见错误11.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345