2009-04-08 88 views
4

我有一个批处理文件在Visual Studio自定义生成步骤中运行,以将文件复制到安装目录中。我希望它在复制失败时正确地出错。与我有选择的问题是:如何在Visual Studio(2008 SP1)项目中从.bat返回错误?

  • exit 1
    这个工程构建顺序以内罚款,但有时我想通过命令行或从另一个批处理使用批处理文件,并在这些情况下, exit也会导致调用者退出。

  • exit /b 1
    这在命令行或从另一个批处理文件工作得很好,但Visual Studio中不识别的返回码不是0(即它的报告具有工程“0错误(S)”) 。

我碰到那个为我提供了一个解决方案的链接: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版本之间有不同的行为)。

+0

@Owen,我不知道答案,但是如果你指定你正在使用的VS的版本,它可能会有所帮助。答案可能会有所不同,具体取决于VS的确切版本。 – 2009-04-08 00:46:26

+0

好点。这是VS 2008。 – Owen 2009-04-08 01:01:24

回答

2

关于您的实际问题,从过程的返回值,
This page指定了VS所期望的完整语法作为构建工具的输出。

1

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

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所以这可能是不同的。

+0

有趣。这是目前在文件上的自定义构建步骤。我尝试了它作为构建事件并得到了相同的结果。我甚至尝试将脚本改为正是你所拥有的。 但是,我很确定它在我的机器上不起作用。只需修改“回显”行即可更改结果。 – Owen 2009-04-08 01:45:25

1

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

退出应该工作,但如果没有,不管什么原因,你总是可以使用助手程序来设置你的返回值。

早在DOS时代,您可以将ECHO与CHOICE命令结合使用来设置您的返回值,但唉,它不再是Windows的一部分。

所以你可以写一个小程序。这些东西把所需的返回值作为参数,然后设置并返回作为返回值:

#include <cstdio> 

int main(int argc, char * argv[]) { 

    if (argc == 2) { 

     return strtoul(argv[1], NULL, 10); 

    } else { 
     return 0; 
    } 
} 

然后在批处理文件中,你只需要调用与所需的返回值的程序,并跳转到最后。

+0

有趣!这确实有效。我真的不知道“exit/b”是什么问题...... – Owen 2009-04-08 15:03:05

2

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

set errorlevel=1 
exit /b 

这基本上已经是什么@Bill表明同样的效果。最后的程序运行的返回值被设置为所谓%errorlevel%环境变量,然后当你退出CMD.EXE这是(这是VS读取)

+0

与“exit/b 1”一样的问题:它不起作用。但是,如果我“设置errorlevel = 1”,然后“退出”,它会起作用。 – Owen 2009-04-08 14:39:44

0

由于某些原因,exit /b 12在写入后构建步骤时未设置退出代码。经常的exit 12会工作。

所以正确地从bat文件返回退出代码,你应该这样写:

​​

call命令是重要的,当运行该批处理文件,它会创建一个新的上下文bat文件中,所以当你运行在bat文件中运行exit /b 1,它将退出该上下文,而不是整个命令解释器。然后,您可以比较错误级别并退出。

相关问题