1

Получил услугу Windows и ее воссоздать с помощью сборки проекта.Событие Pre/Post для службы Windows. Лучшая практика

В предварительном случае:

СБН запрос "Сервис" | findstr/i работает | если "% errorlevel%" == "0" (sc stop "Service")

sc query "Service" | findstr/i работает | если "% ERRORLEVEL%" == "0" (СБН удалить "Сервис")

В пост события:

C: \ Windows \ Microsoft.NET \ Framework64 \ v4. 0.30319 \ InstallUtil.exe $ (TargetPath)

чистый старт "Сервис"

, но у меня есть такие вопросы, как

Ошибка 1 Команда «C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Installutil.exe D: ... \ Bin \ Debug \ host.exe

чистый старт «Служба» «вышла с кодом 2. Хост

любая помощь, пожалуйста?

ответ

0

Не забудьте, что сценарии в событиях Build - это не что иное, как скрипты оболочки, поэтому пробелы в путях (или сборках и т. Д.) Будут вкручиваться, если вы не окружите [double] кавычками.

Что я делаю, это использовать макрос $ {TargetPath} и ​​т. Д. В оболочке, вводя команды точно так, как они будут развернуто, прежде всего, чтобы убедиться, что оно правильно. Там, где вы увидите, досталась ли вам проблема пространства.

Я согласен с тем, что интерфейс VS не дает много конкретной обратной связи, но, честно говоря, он действительно просто открывается в оболочку и отображает то, что возвращает оболочка после, это делается со всеми строками.

Таким образом, уровень ошибок ('код выхода' на VS) в одной строке помещается для итогового уровня ошибки a.

Вот 2 пакетных файлов я ставлю в моем корне проекта, "Copy Если Новее" для вывода директории, и запустить в командной строке:

.\startDeploy.bat 

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe SomeService.exe 
net start "Some Server" 

... и ...

.\stopDeploy.bat 

net stop "Some Server" 
    C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe /LogToConsole=true /u SomeService.exe 

Если у вас есть лучший способ сделать это (мне нравится использование sc), тогда просто промойте, налейте, повторите. Когда вы уверены, что все хорошо, а затем конвертируйте в окно (события) Build events. Я не делаю этого, пока не буду готов к развертыванию.

0

Это работает для меня ...

"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe" /u $(TargetFileName) 
"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe" $(TargetFileName) 
net start "Replace With Service Name" 

Я размещаю эти команды в разделе «После сборки» событий сборки.

В первой строке будет удален существующий экземпляр вашего сервиса. Это не сработает, если служба не существует, поэтому не нужно сначала запрашивать службу. Вам также не нужно останавливать службу, удаление будет делать это автоматически.

Вторая линия установит/переустановит ваше обслуживание.

Третья строка начнет обслуживание. Обязательно измените это имя службы без каких-либо расширений.

Надеюсь, это поможет.

0

Я столкнулся с той же проблемой. В моем случае это происходило, когда вы пытались остановить службу Windows с помощью команды sc stop "Service", когда служба уже остановлена.

В случае возникновения ошибки при выполнении команды, поэтому командная оболочка возвращает ненулевое значение (в основном 1 или целочисленный код ошибки) в качестве кода возврата, на основе которого Visual Studio останавливает дальнейший процесс сборки.

Поскольку служба уже остановлена, так что мы хотим, чтобы Visual Studio просто игнорировала код возврата. Вы можете достичь этого в любом случае, как указано ниже. Просто добавьте его в конце вашего предварительного построения кода события:

SET ERRORLEVEL = 0 

Или

EXIT 0 

Это принудительно возвращает 0 (успех) код даже в случае каких-либо ошибок, когда служба уже остановлена государство. Так что мой полный код события Pre-сборки выглядит следующим образом:

IF "Debug" == "$(ConfigurationName)" ( 
    sc query "W3SVC" | findstr "RUNNING" & if %errorlevel% == 0 (net stop "World Wide Web Publishing Service") 
    EXIT 0 

Мое намерение состояло в том, чтобы остановить службу IIS только для отладки сборки.