在Visual Studio 2010中处理预构建步骤中的错误

35

我的解决方案包含多个项目,其中一个是Windows服务;我有一个预构建步骤来停止该服务,并有一个后构建步骤来重新启动它(这样在VS构建/覆盖该exe文件时,Windows服务exe文件不会被锁定)。

on pre-build: 
net stop myservice

on post-build:
net start myservice

如果在我启动构建时服务未运行,则net stop命令将失败,这会阻止构建继续进行。

即使预构建步骤失败,我该怎么做才能强制执行构建?

6个回答

59

我想通了 - 你只需要在结尾添加以下语句:

SET ERRORLEVEL = 0

或者简单地说:

EXIT 0

1
我必须删除空格才能使第一个工作:SET ERRORLEVEL=0 - SandRock

34

我知道这是一篇旧文章,但我最近也遇到了这个问题。如果正在运行进程,我想要杀死正在构建的进程,并发现可以执行以下操作:

taskkill /f /im $(TargetName).exe 2>nul 1>nul
Exit 0

2>nul 1>nulExit 0或反之亦然似乎都不起作用。我必须做到两者兼备。

值得注意的是,这是使用Visual Studio Express 2012实现的。

在查看此问题时,我也在这个博客中找到了解决方案。

2>nul 1>nul将吞噬命令的stderr和stdout。 EXIT 0将确保构建事件返回0。


这正是我想要做的。另外需要注意的一点是:我发现在一个批处理文件中使用EXIT 0,并通过CALL myscript.bat从VS2015构建操作调用该文件时,会导致整个操作在myscript.bat之后退出。但是,使用SET ERRORLEVEL = 0可以解决这个问题。 - Daniel Earwicker
1
2>nul &set errorlevel=0 这样可以让你在后面添加额外的行,无需重定向标准输出 1> nul - Dmitry Gusarov
同样适用于VS2017。 - John Baker
也适用于VS2019 - Hossein

6
无需重定向标准输出,只需重定向标准错误。此外,set errorlevel 可以让你在需要时添加额外的行。Exit 将立即终止。 taskkill /f /im:$(TargetFileName) 2>nul &set errorlevel=0 可在 VS 2017 中使用。

4
有点晚了,但这是个好的解决方案,我还是要分享一下。
下面的解决方案摘自博客文章
你只需按需定义你的后构建步骤。你不需要将它们包装成批处理文件,但你可以这样做。然后你修改你的项目文件(如vbproj或csproj文件),并在项目结束标签之前插入以下片段:
<Target
  Name="PostBuildEvent"
  Condition="'$(PostBuildEvent)'!=''"
  DependsOnTargets="$(PostBuildEventDependsOn)">
  <Exec WorkingDirectory="$(OutDir)" Command="$(PostBuildEvent)" ContinueOnError="true" />
</Target>

这将改变visual studio执行后置构建步骤的方式。ContinueOnError属性指示VS简单地忽略错误。它仍会在构建结果中发出警告,但不会停止构建。您可以通过相应更改上述片段来对PreBuildEvent做同样的操作。当然,这仅适用于完整的所有构建步骤。您不能选择性地仅忽略某些步骤的错误。如果您需要这样做,则必须坚持使用批处理文件的解决方案,但上述解决方案的好处是您不需要单独的批处理文件。Sascha

0

-3

将命令嵌入始终返回0的可执行文件中是否可以解决您的问题?

在C语言中调用

system("net stop myservice")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接