代码之家  ›  专栏  ›  技术社区  ›  Owen

如何在Visual Studio(2008 SP1)项目中从.bat返回错误?

  •  4
  • Owen  · 技术社区  · 17 年前

    我有一个批处理文件正在Visual Studio自定义生成步骤中运行,以将文件复制到安装目录中。我希望它在拷贝失败时能正确地出错。我选择的问题是:

    • exit 1
      这在构建序列中很好地工作,但有时我希望从命令行或从另一批中使用批处理文件,在这些情况下, exit 使调用方也退出。

    • exit /b 1
      这在命令行或其他批处理文件中很好地工作,但Visual Studio无法识别返回代码不是0(即,它报告项目有“0个错误”)。

    我遇到了一个链接,它为我提供了一个解决方案: http://www.nabble.com/Re:-bjam-and-Windows-p17457249.html

    本质上说,在执行 exit /b . 例如,

    echo MyProj : error : could not copy files.
    

    有人确切知道什么消息格式触发了Visual Studio来识别错误吗?

    我试过调整这个和一些工作,有些没有。似乎它必须符合

    .*\: .*error.*\:
    

    这是在任何地方记录的吗?

    谢谢。

    这是Windows XP Pro SP3上的Visual Studio 2008 SP1(以防 cmd.exe 在Windows版本之间有不同的行为)。

    5 回复  |  直到 10 年前
        1
  •  2
  •   shoosh    17 年前

    关于你的实际问题,
    This page 指定VS预期作为生成工具输出的完整语法。

        2
  •  2
  •   shoosh    17 年前

    你可以尝试的另一件事是:

    set errorlevel=1
    exit /b
    

    这基本上与@bill建议的效果相同。上次运行的程序的返回值设置为环境变量 %errorlevel% 然后,当退出cmd.exe时,这是从进程返回的值(这是vs读取的值)

        3
  •  1
  •   shoosh    17 年前

    你确定你测试的是正确的吗? 我刚试过这个批处理文件:

    echo bla
    exit /b 1
    

    在VS2008中,作为预构建步骤,得到了:

    1>------ Build started: Project: XXXX, Configuration: Debug Win32 ------
    1>Performing Pre-Build Event...
    1>bla
    1>Project : error PRJ0002 : Error result 1 returned from 'C:\Windows\system32\cmd.exe'.
    1>Build log was saved at "file://c:\XXXXX\BuildLog.htm"
    1>XXXXX - 1 error(s), 0 warning(s)
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
    

    我还尝试了对具有相同结果的文件进行自定义生成步骤。
    应该注意的是,我使用的是VS2008- SP1 所以这可能就是区别。

        4
  •  1
  •   Bill B    17 年前

    通常,批处理文件的返回值是从批处理文件中执行的最后一个命令的返回值。

    出口 应该 工作,但是如果它不工作,无论出于什么原因,您都可以使用一个助手程序来设置您的返回值。

    在DOS时代,可以将echo与choice命令结合使用来设置返回值,但遗憾的是,它不再是Windows的一部分。

    所以你可以写一个小程序。将所需返回值作为参数,然后将其设置并返回为返回值的内容:

    #include <cstdio>
    
    int main(int argc, char * argv[]) {
    
        if (argc == 2) {
    
            return strtoul(argv[1], NULL, 10);
    
        } else {
            return 0;
        }
    }
    

    然后在批处理文件中,只需使用所需的返回值调用程序,并跳到末尾。

        5
  •  0
  •   Calmarius    10 年前

    出于某种原因 exit /b 12 在写入后期生成步骤时不设置退出代码。规则的 exit 12 会起作用。

    因此,要正确地从BAT文件返回退出代码,应该编写以下代码:

    call yourbat.bat
    if %errorlevel% NEQ 0 exit %errorlevel%
    

    这个 call 命令在运行BAT文件时很重要,它会创建一个新的上下文BAT文件在其中运行,因此在运行时 exit /b 1 在BAT文件中,它将退出该上下文,而不是整个命令解释器。然后您可以比较错误级别和退出。