批处理文件错误或cl.exe位于编译结果/退出

时间:2015-09-24 00:02:40

标签: batch-file visual-studio-2013

我正在编写一个测试标头策略的批处理文件(每个标头必须包含/解析它自己的依赖项),但是即使它实际上失败了,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

1 个答案:

答案 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命令。