2017-10-12 43 views
0

我有一个批处理文件,用一些参数启动CMake.exe,如果CMake中有任何错误(这是产品构建过程的一部分),我需要中断执行。问题是,%ERRORLEVEL%来自CMake.exe过程似乎永远是0,而stadard错误输出可能包含错误,如我如何处理CMake.exe错误

 
... 
-- 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

[如何知道cmake项目代是否成功结束](https://stackoverflow.com/questions/38253153/how-to-know-whether-the-cmake-project-generation-ended- with-success) – Florian

+0

如果你没有在你的问题中提供它,我们应该如何帮助你使用批处理文件代码? – Squashman

回答

1

最常犯的错误是在以(开头并以匹配)结尾的命令块中使用%ERRORLEVEL%

整个命令块是由Windows命令解释在命令块中运行的任何命令之前预处理或IFFOR命令通常与开口(使用上线。在此预处理期间,所有%variable%引用都被引用的环境变量的当前值替换。然后用预处理代码执行命令块。

此行为可以通过删除批处理文件顶部的@echo off或将其修改为@echo onrem @echo off并从命令提示符窗口内运行批处理文件来看到。现在Windows命令解释器输出到控制台窗口,每个命令行和命令块在预处理之后,接下来才真正执行。

命令SET对命令提示窗口运行set /?输出帮助上IFFOR例如如何在同一命令行修改的命令行或命令块中引用的环境变量解释或命令块执行时使用延迟环境变量扩展

但是对于这种情况,在预处理阶段不需要扩展%ERRORLEVEL%,或者根本不需要使用!ERRORLEVEL!进行延迟扩展。

有美好的旧IF ERRORLEVEL X ...语法,因为MS-DOS工作到目前最新的Windows 10和微软在最古老的支持文章中描述仍然在线:
Testing for a Specific Error Level in Batch Files

CMake的退出,退出代码0成功,错误更多,几乎所有控制台应用程序都出错。

IF ERRORLEVEL X ...装置IF退出代码分配给环境变量ERRORLEVEL(的函数main返回值)是大于或等于XTHEN ...

那么我建议把眼光放在:

成功IF不修改的ERRORLEVEL值。而且EXIT /B没有号码也不会修改ERRORLEVEL

所以上运行CMake的命令行后下一行,只有退出当前批处理文件的处理,并返回到调用由CMake的遇到的任何错误的批处理文件或进程需要此命令行:

if errorlevel 1 exit /B 

调用批处理文件或进程得到的CMake的退出代码为批处理文件执行的结果,因为IFEXIT不修改ERRORLEVEL在这种情况下。这真的很容易!