我有一个批处理文件,它使用一些参数启动CMake.exe,如果CMake中有任何错误(这是产品构建过程的一部分),我需要中断执行。问题是来自CMake.exe进程的%ERRORLEVEL%似乎总是0,而stadard错误输出可能包含错误,如
... -- Configuring done CMake Error at CMakeConfigs/My.cmake:77 (add_library): Cannot find source file: Resources/ActionIcons/ActionIcon_ABC.png Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp .hxx .in .txx Call Stack (most recent call first): My/Path/CMakeLists.txt:149 (my_add_target) -- Generating done ...
我计划将标准错误输出转储到文件和grep / findstr错误,但错误处理可以更优雅地完成吗?
感谢。
答案 0 :(得分:1)
最常见的错误是在以%ERRORLEVEL%
开头并以匹配(
结尾的命令块中使用)
。
在命令块中运行任何命令或通常在打开{{1 }}。在此预处理期间,所有(
引用都将被引用的环境变量的当前值替换。然后使用预处理的代码执行命令块。
通过删除批处理文件顶部的%variable%
或将其修改为@echo off
或@echo on
并从命令提示符窗口中运行批处理文件,可以看到此行为。现在,Windows命令解释器在预处理之后将每个命令行和命令块输出到控制台窗口,如下所示。
命令提示符窗口中运行rem @echo off
时命令 SET 输出的帮助解释了 IF 和 FOR 示例如何使用延迟环境变量扩展引用在执行时在同一命令行或命令块中修改的命令行或命令块中的环境变量。
但是对于这种情况,在预处理阶段不需要set /?
扩展,或者根本不需要使用%ERRORLEVEL%
进行扩展。
从MS-DOS到目前最新的Windows 10,有一个很好的旧!ERRORLEVEL!
语法,微软在一篇仍在线的最旧支持文章中描述了这种语法:
Testing for a Specific Error Level in Batch Files
CMake 在成功时以退出代码IF ERRORLEVEL X ...
退出,并在几乎所有控制台应用程序上出现更多错误。
0
表示分配给环境变量IF ERRORLEVEL X ...
的 IF 退出代码(函数main
的返回值)大于或等于 ERRORLEVEL
然后 ...
然后我建议看看:
成功的 IF 不会修改X
的值。没有数字的ERRORLEVEL
也不会修改EXIT /B
。
因此,在命令行运行 CMake 之后的下一行,只需要此命令行退出当前批处理文件的处理并返回调用批处理文件或处理 CMake的:
ERRORLEVEL
由于 IF 和退出 don',调用批处理文件或进程会因批处理文件执行而获取 CMake 的退出代码在这种情况下修改if errorlevel 1 exit /B
。这真的很容易!