Swallowing errors in pre-build steps in Visual Stu

2020-02-03 05:10发布

问题:

My solution has a bunch of projects one of which is a windows service; I have a prebuild step to stop the service and a postbuild step to restart it (this way the windows service exe is not locked when VS is building/overwriting it).

on pre-build: 
net stop myservice

on post-build:
net start myservice

If the service is not running while I'm starting the build, the net stop command fails and that prevents the build from proceeding.

What can I do to still force the build even if the pre-build step failed?

回答1:

I figured it out - you simply need to add the following statement at the end:

SET ERRORLEVEL = 0

or simply:

EXIT 0


回答2:

I know this is an old post, but I recently had this issue as well. I wanted to kill the process that I was building if it was currently running, and found that I could do:

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

2>nul 1>nul without Exit 0, or vice versa, doesn't seem to work. I have to do both.

Also worth noting this is using Visual Studio Express 2012.

I found the solution when looking into this issue as well on this blog

The 2>nul 1>nul will swallow the stderr and stdout from the command. The EXIT 0 will make sure the build event returns 0.



回答3:

There is no need to redirrect stdout, just stderr. Also, set errorlevel allows you to have extra lines later if you need. Exit will terminate immediately.

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

Works in VS 2017.



回答4:

Wrap your net commands in a batch file and use exit /B 0

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



回答5:

A bit late, but a good solution, so I'll share it anyway.

The following solution was taken from this blog post.

You simply define your e.g. post build steps as needed. You don't need to wrap them into a batch file, but you could. Then you alter you project file (such as a vbproj or csproj file) and insert the following fragment just before the project closing-tag:

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

This changes the way visual studio executes the post build steps. The ContinueOnError Attributes instructs VS to simply ignore errors. It still issues warnings in the build results, but it does not stop the build.

You can do the same for the PreBuildEvent by changing the above fragment accordingly.

Of course this works only for all of the build steps in full. You can not selectivly ignore errors on certain steps only. If you need to do that you have to stick to the solution with the batch file, but the nice thing about the solution above is you don't need a separate batch.

Sascha



回答6:

Would embedding the command in an executable that always returns 0 solve your issue?

in c call

system("net stop myservice")