如果有以下行,则不设置Windows批处理文件返回代码

时间:2017-07-17 18:42:31

标签: batch-file

以下Windows批处理文件名为" foo.bat"回声"退出"并按我的预期将返回码设置为1:

if "1"=="1" (
  if "1"=="1" (
    echo quitting
    exit /B 1
  )
)

但是,令我惊讶的是,这个批处理文件的返回码是0:

if "1"=="1" (
  if "1"=="1" (
    echo quitting
    exit /B 1
  )

  echo anything
)

我在Windows命令提示符中确定批处理文件的返回代码:

> cmd.exe /c foo.bat
quitting
> echo %ERRORLEVEL%
0

我已经验证我的环境中尚未设置ERRORLEVEL,运行set ERRORLEVEL打印"未定义环境变量ERRORLEVEL"如预期的那样。

关于第二个文件的其他所有内容都按预期工作。它 回声"退出"和没有回应"任何"。似乎将echo anything行添加到脚本意味着行exit /B 1仍然退出但未设置返回代码。

这是EC2中的Windows 7。 ver报告" Microsoft Windows [版本6.1.7601]"。

有没有办法确保exit /B 1真正设置返回代码,即使在复杂的if语句中也是如此?

3 个答案:

答案 0 :(得分:1)

如果我将文件扩展名从“.bat”更改为“.cmd”,那么它的行为与预期一致。

答案 1 :(得分:0)

您的测试环境是什么? 你是否真的没有其他副作用?

此批次在Win7Ult和Win10pro中得到了预期的结果

reduce
var arr = [{
  "listingId": "p106a904a-b8c6-4d2d-a364-0d21e3505010",
  "section": "section1",
  "category": "VIP PASS ",
  "type": "paper",
  "availableTickets": 1
}, {
  "listingId": "p106904a-b8c6-4d2d-a364-0d21e3505010",
  "section": "section1",
  "category": "VIP PASS ",
  "type": "paper",
  "availableTickets": 2
}, {
  "listingId": "pc8f54389-4e58-482a-9535-6917c2948764",
  "section": "1",
  "category": "WIP",
  "type": "paper",
  "availableTickets": 1
}];

var unique = arr.reduce((map, o) => (map.has(o.category) ? map : map.set(o.category)),new Map());
console.log(Array.from(unique.keys()));

答案 2 :(得分:0)

我也遇到了同样的问题。我用这样的方法解决了它:

if "1"=="1" (
    if "1"=="1" (
        echo quitting
        goto Exit1
    )
    echo anything
)
goto :Eof

:Exit1
exit /b 1

另一个“已知”缺陷是:

rem t.bat
copy non-existing somewhere
rem

C:\> cmd /c t.bat
The system cannot find the file specified.
C:\> echo %errorlevel%
0

在使用 cmd /c 运行时,在批处理文件末尾显式返回错误级别不起作用,如果之后有注释(或回显或通常不会更改错误级别的内容)。所以需要改用这个:

rem t.bat
copy non-existing somewhere
exit /b %errorlevel%
rem

C:\> cmd /c t.bat
The system cannot find the file specified.
C:\> echo %errorlevel%
1