我的解决方案有一堆项目,其中一个是Windows服务;我有一个预建步骤来停止服务和一个postbuild步骤重新启动它(这样,当VS正在构建/覆盖它时,windows service exe不会被锁定)。
on pre-build:
net stop myservice
on post-build:
net start myservice
如果在我开始构建时服务没有运行,则net stop命令会失败并阻止构建继续进行。
即使预构建步骤失败,我还能做什么来强制构建?
答案 0 :(得分:52)
我想通了 - 你只需要在最后添加以下语句:
SET ERRORLEVEL = 0
或简单地说:
EXIT 0
答案 1 :(得分:25)
我知道这是一个老帖子,但我最近也有这个问题。我想杀死我正在构建的进程,如果它当前正在运行,并且发现我可以这样做:
taskkill /f /im $(TargetName).exe 2>nul 1>nul Exit 0
2>nul 1>nul
没有Exit 0
,反之亦然,似乎无效。我必须做两件事。
另外值得注意的是这是使用Visual Studio Express 2012。
我在查看此问题时也找到了解决方案on this blog
2> nul 1> nul将从命令中吞下stderr和stdout。 EXIT 0将确保构建事件返回0。
答案 2 :(得分:4)
没有必要重新修改stdout,只需要stderr。此外,set errorlevel
允许您在以后需要时添加额外的行。退出将立即终止。
taskkill /f /im:$(TargetFileName) 2>nul &set errorlevel=0
在VS 2017中工作。
答案 3 :(得分:0)
将net
命令包装在批处理文件中并使用exit /B 0
答案 4 :(得分:0)
有点晚了,但是是一个很好的解决方案,所以我还是分享一下。
以下解决方案来自此blog post。
您只需定义您的根据需要发布构建步骤。您不需要将它们包装到批处理文件中,但是可以。然后,更改项目文件(例如vbproj或csproj文件),并在项目结束标记之前插入以下片段:
<Target
Name="PostBuildEvent"
Condition="'$(PostBuildEvent)'!=''"
DependsOnTargets="$(PostBuildEventDependsOn)">
<Exec WorkingDirectory="$(OutDir)" Command="$(PostBuildEvent)" ContinueOnError="true" />
</Target>
这更改了Visual Studio执行后期构建步骤的方式。 ContinueOnError属性指示VS忽略错误。它仍会在构建结果中发出警告,但不会停止构建。
您可以通过相应地更改上述片段来对PreBuildEvent进行相同的操作。
当然,这仅适用于完整的所有构建步骤。您不能仅在某些步骤上选择性地忽略错误。如果需要这样做,则必须坚持使用批处理文件的解决方案,但是上述解决方案的好处是您不需要单独的批处理。
Sascha
答案 5 :(得分:-2)
将命令嵌入到始终返回0的可执行文件中会解决您的问题吗?
在c电话中
system("net stop myservice")