我的解决方案包含多个项目,其中一个是Windows服务;我有一个预构建步骤来停止该服务,并有一个后构建步骤来重新启动它(这样在VS构建/覆盖该exe文件时,Windows服务exe文件不会被锁定)。
on pre-build:
net stop myservice
on post-build:
net start myservice
如果在我启动构建时服务未运行,则net stop命令将失败,这会阻止构建继续进行。
即使预构建步骤失败,我该怎么做才能强制执行构建?
我的解决方案包含多个项目,其中一个是Windows服务;我有一个预构建步骤来停止该服务,并有一个后构建步骤来重新启动它(这样在VS构建/覆盖该exe文件时,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 Exit 0
2>nul 1>nul
无Exit 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 Earwicker2>nul &set errorlevel=0
这样可以让你在后面添加额外的行,无需重定向标准输出 1> nul
。 - Dmitry Gusarovset errorlevel
可以让你在需要时添加额外的行。Exit 将立即终止。
taskkill /f /im:$(TargetFileName) 2>nul &set errorlevel=0
可在 VS 2017 中使用。<Target
Name="PostBuildEvent"
Condition="'$(PostBuildEvent)'!=''"
DependsOnTargets="$(PostBuildEventDependsOn)">
<Exec WorkingDirectory="$(OutDir)" Command="$(PostBuildEvent)" ContinueOnError="true" />
</Target>
将命令嵌入始终返回0的可执行文件中是否可以解决您的问题?
在C语言中调用
system("net stop myservice")
SET ERRORLEVEL=0
。 - SandRock