我正在编写一个测试标头策略的批处理文件(每个标头必须包含/解析它自己的依赖项),但是即使它实际上失败了,cl.exe也会返回成功。
没有评论的剧本是:
@echo off
set FNAME=temp
set OBJFILE=%FNAME%.obj
set SRCFILE=%FNAME%.cc
for /f "delims=|" %%i in ('dir /b /s ..\include\*.h') do (
( echo #include "%%i" & echo void test^(^){} ) > %SRCFILE%
echo %%i
"%VCINSTALLDIR%\bin\cl.exe" /c /W4 %SRCFILE% > NUL 2>&1
if not ERRORLEVEL 0 goto failed
)
goto success
:failed
echo.
echo Compile failed.
goto fin
:success
echo.
echo Success.
goto fin
:fin
if exist %OBJFILE% del %OBJFILE% > NUL
if exist %SRCFILE% del %SRCFILE% > NUL
我怀疑错误在于错误级别检测(我已阅读raymond chens article,以及有关其警告的其他SO帖子),但所有尝试的变体也以同样的方式失败,让我想cl.exe is lying。我可能完全错了,所以我打算用ProcMon检查 - 但遗憾的是它此刻正在崩溃。
这只是我的愚蠢吗?
我目前使用FakeType blah;
强制在头文件中失败,如果我重定向到文件,cl.exe会输出:
...\include\fail.h(1) : error C2146: syntax error : missing ';' before identifier 'blah'
...\include\fail.h(1) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
答案 0 :(得分:3)
程序通常通过大于零的ERRORLEVEL值返回错误代码;但是,cl.exe可能会在出现错误时返回ERRORLEVEL的正值或负值,如果正常则返回零值。通常的形式:
if errorlevel num ...
如果errorlevel 大于或等于,则为真,所以
if not ERRORLEVEL 0 goto failed
当errorlevel 小于零时,将为true。有两种方法可以测试errorlevel是否正好为零:
if errorlevel 0 if not errorlevel 1 goto success
即,如果errorlevel大于或等于零且小于1.也许最明确的方法是直接比较errorlevel值:
if !errorlevel! equ 0 goto success
请记住,此表单在开始时需要setlocal EnableDelayedExpansion
命令。