35

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

on pre-build: 
net stop myservice

on post-build:
net start myservice

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

即使预构建步骤失败,我还能做些什么来强制构建?

4

6 回答 6

58

我想通了 - 您只需要在最后添加以下语句:

SET ERRORLEVEL = 0

或者简单地说:

EXIT 0
于 2011-04-27T20:39:24.560 回答
33

我知道这是一个旧帖子,但我最近也遇到了这个问题。如果它当前正在运行,我想杀死我正在构建的进程,并发现我可以这样做:

taskkill /f /im $(TargetName).exe 2>nul 1>nul
0号出口

2>nul 1>nul没有Exit 0,反之亦然,似乎不起作用。我必须两者都做。

另外值得注意的是使用 Visual Studio Express 2012。

我在这个博客上调查这个问题时也找到了解决方案

2>nul 1>nul 将从命令中吞下标准错误和标准输出。EXIT 0 将确保构建事件返回 0。

于 2014-07-04T21:17:09.257 回答
6

无需重定向标准输出,只需重定向标准错误。此外,set errorlevel如果您需要,允许您稍后有额外的行。退出将立即终止。

taskkill /f /im:$(TargetFileName) 2>nul &set errorlevel=0

在 VS 2017 中工作。

于 2017-04-04T12:52:55.597 回答
3

有点晚了,但一个很好的解决方案,所以我还是会分享它。

以下解决方案取自此博客文章

您只需根据需要定义您的例如后期构建步骤。您不需要将它们包装到批处理文件中,但可以。然后更改项目文件(例如 vbproj 或 csproj 文件)并在项目结束标记之前插入以下片段:

<Target
  Name="PostBuildEvent"
  Condition="'$(PostBuildEvent)'!=''"
  DependsOnTargets="$(PostBuildEventDependsOn)">
  <Exec WorkingDirectory="$(OutDir)" Command="$(PostBuildEvent)" ContinueOnError="true" />
</Target>

这改变了 Visual Studio 执行后期构建步骤的方式。ContinueOnError 属性指示 VS 简单地忽略错误。它仍然会在构建结果中发出警告,但不会停止构建。

您可以通过相应地更改上述片段来对 PreBuildEvent 执行相同的操作。

当然,这只适用于所有构建步骤。您不能仅选择性地忽略某些步骤上的错误。如果您需要这样做,您必须坚持使用批处理文件的解决方案,但上述解决方案的好处是您不需要单独的批处理。

萨沙

于 2019-11-28T09:57:23.507 回答
0

将命令包装net在批处理文件中并使用exit /B 0

http://ss64.com/nt/exit.html

于 2011-04-27T15:26:56.257 回答
-3

将命令嵌入到始终返回 0 的可执行文件中会解决您的问题吗?

在 c 调用中

system("net stop myservice")
于 2011-04-27T15:20:19.290 回答