我的解决方案有一堆项目,其中一个是 Windows 服务;我有一个停止服务的预构建步骤和一个重新启动它的构建后步骤(这样,当 VS 构建/覆盖它时,Windows 服务 exe 不会被锁定)。
on pre-build:
net stop myservice
on post-build:
net start myservice
如果在我开始构建时服务未运行,则 net stop 命令会失败,这会阻止构建继续进行。
即使预构建步骤失败,我还能做些什么来强制构建?
我的解决方案有一堆项目,其中一个是 Windows 服务;我有一个停止服务的预构建步骤和一个重新启动它的构建后步骤(这样,当 VS 构建/覆盖它时,Windows 服务 exe 不会被锁定)。
on pre-build:
net stop myservice
on post-build:
net start myservice
如果在我开始构建时服务未运行,则 net stop 命令会失败,这会阻止构建继续进行。
即使预构建步骤失败,我还能做些什么来强制构建?
我想通了 - 您只需要在最后添加以下语句:
SET ERRORLEVEL = 0
或者简单地说:
EXIT 0
我知道这是一个旧帖子,但我最近也遇到了这个问题。如果它当前正在运行,我想杀死我正在构建的进程,并发现我可以这样做:
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。
无需重定向标准输出,只需重定向标准错误。此外,set errorlevel
如果您需要,允许您稍后有额外的行。退出将立即终止。
taskkill /f /im:$(TargetFileName) 2>nul &set errorlevel=0
在 VS 2017 中工作。
有点晚了,但一个很好的解决方案,所以我还是会分享它。
以下解决方案取自此博客文章。
您只需根据需要定义您的例如后期构建步骤。您不需要将它们包装到批处理文件中,但可以。然后更改项目文件(例如 vbproj 或 csproj 文件)并在项目结束标记之前插入以下片段:
<Target
Name="PostBuildEvent"
Condition="'$(PostBuildEvent)'!=''"
DependsOnTargets="$(PostBuildEventDependsOn)">
<Exec WorkingDirectory="$(OutDir)" Command="$(PostBuildEvent)" ContinueOnError="true" />
</Target>
这改变了 Visual Studio 执行后期构建步骤的方式。ContinueOnError 属性指示 VS 简单地忽略错误。它仍然会在构建结果中发出警告,但不会停止构建。
您可以通过相应地更改上述片段来对 PreBuildEvent 执行相同的操作。
当然,这只适用于所有构建步骤。您不能仅选择性地忽略某些步骤上的错误。如果您需要这样做,您必须坚持使用批处理文件的解决方案,但上述解决方案的好处是您不需要单独的批处理。
萨沙
将命令包装net
在批处理文件中并使用exit /B 0
将命令嵌入到始终返回 0 的可执行文件中会解决您的问题吗?
在 c 调用中
system("net stop myservice")