正如@dbenham所说,“[i] f命令在EXIT / B之后解析,在同一个命令块中,然后问题就会出现,即使后续命令永远不会执行”.在这种特殊情况下,IF语句的主体基本上被评估为
(echo first if) & (exit /b 1) & (if "" == "" (echo second if))
和& operator是cmd!eComSep函数(即命令分隔符).通过将全局变量cmd!LastRetCode设置为1然后基本上执行GOTO:EOF来评估EXIT / B 1命令(函数cmd!eExit).当它返回时,第二个eComSep看到cmd!GotoFlag已设置,因此跳过评估右侧.在这种情况下,它还忽略左侧的返回码而改为返回SUCCESS(0).这会被传递到堆栈以成为进程退出代码.
下面我已经包含了运行bug.cmd和ok.cmd的调试会话.
bug.cmd:
(test) C:\Temp>cdb -oxi ld python
Microsoft (R) Windows Debugger Version 6.12.0002.633 AMD64
Copyright (c) Microsoft Corporation. All rights reserved.
CommandLine: python
Symbol search path is: symsrv*symsrv.dll*
C:\Symbols*http://msdl.microsoft.com/download/symbols
Executable search path is:
(1404.10b4): Break instruction exception - code 80000003 (first chance)
ntdl