Don't forget that the scripts in Build events are really nothing more than shell scripts, so spaces in paths (or assemblies, etc.) will screw it up if you don't surround with [double] quotes.
What I do is use the macro ${TargetPath}, etc. in a shell, entering the commands exactly as they would be expanded, first to make sure it is correct. There is where you will see whether the space issue has got you.
I agree that the VS interface doesn't give a lot of specific feedback, but in fairness, it is really just forking off to a shell, and displaying what the shell returns after it is done with all lines.
So, an errorlevel ('exit code' to VS) on one line is tossed for a summary error level a the end.
Here are 2 batch files I put in my project root, "Copy If Newer" to output dir, and run on command line:
.\startDeploy.bat
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe SomeService.exe
net start "Some Server"
...and...
.\stopDeploy.bat
net stop "Some Server"
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe /LogToConsole=true /u SomeService.exe
If you have a better way to do it (I like your use of sc), then just rinse, lather, repeat. When you are sure things are good, then convert into the Build events window(s). I don't do this until I am ready to deploy.