Глотание ошибок на этапах предварительной сборки в Visual Studio 2010

Мое решение имеет несколько проектов, одним из которых является служба Windows; У меня есть шаг предварительной сборки, чтобы остановить службу, и шаг после сборки, чтобы перезапустить ее (таким образом, exe службы Windows не блокируется, когда VS строит / перезаписывает его).

on pre-build: 
net stop myservice

on post-build:
net start myservice

Если служба не работает, пока я запускаю сборку, команда net stop завершается неудачно, и это препятствует продолжению сборки.

Что я могу сделать, чтобы форсировать сборку, даже если предварительная сборка не удалась?

5 ответов

Решение

Я понял это - вам просто нужно добавить следующее утверждение в конце:

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 проглотит stderr и stdout из команды. 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

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

Разве встраивание команды в исполняемый файл, который всегда возвращает 0, решит вашу проблему?

в вызове

system("net stop myservice")
Другие вопросы по тегам