Использование InstallUtil для удаления службы, которая не существует

Я использую события pre и post build моей службы для удаления и установки службы. Единственная проблема заключается в том, что первый раз, когда другой разработчик использует событие pre build, он терпит неудачу, так как служба еще не установлена.

мое текущее событие предварительной сборки, которое удаляет

%WinDir%Microsoft.NETFrameworkv4.0.30319InstallUtil /u $(TargetPath)

Как я могу использовать это, чтобы только удалить, когда служба уже установлена?

3 ответов


вы можете использовать средство Microsoft SC (Sc.exe), чтобы запросить статус службы или даже создать или удалить ее. Вот статья об использовании этой команды:http://support.microsoft.com/kb/251192

из окна командной строки (содержимое отредактировано для акцента):

C:\windows\system32>sc
DESCRIPTION:
        SC is a command line program used for communicating with the
        Service Control Manager and services.
USAGE:
        sc <server> [command] [service name] <option1> <option2>...

       The option <server> has the form "\ServerName"
       Further help on commands can be obtained by typing: "sc [command]"
       Commands:
         query-----------Queries the status for a service, or
                         enumerates the status for types of services.
         queryex---------Queries the extended status for a service, or
                         enumerates the status for types of services.
         start-----------Starts a service.
         pause-----------Sends a PAUSE control request to a service.
         continue--------Sends a CONTINUE control request to a service.
         stop------------Sends a STOP request to a service.
         delete----------Deletes a service (from the registry).
         create----------Creates a service. (adds it to the registry).

выполнение этой команды для запроса Службы, которая (A) существует и (B) не существует результатов в:

(A)

C:\Windows\System32>sc query W32Time

SERVICE_NAME: W32Time
        TYPE               : 20  WIN32_SHARE_PROCESS
        STATE              : 1  STOPPED
        WIN32_EXIT_CODE    : 1077  (0x435)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

(B)

C:\Windows\System32>sc query nothere
[SC] EnumQueryServicesStatus:OpenService FAILED 1060:

The specified service does not exist as an installed service.

таким образом, вы можете проверить наличие службы, прежде чем пытаться удалить ее, используя следующее -- (простите отвратительное использование оператора FOR, я не совсем уверен, как захватить вывод команды sc в переменную или использовать его в операторе IF) --

set svcname=W32Time
set svc=exists
for /f "delims=" %%o in ('sc query %svcname% ^| find "FAIL"') do set svc=notexists

if "%svc%"=="exists" sc delete %svcname%

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

мой prebuild является

net stop P2PSN.Bridge.Service
$(FrameworkDir)\installutil.exe /u $(TargetPath)
Exit /b 0

мой пост сборки

$(FrameworkDir)\installutil.exe /ShowCallStack $(TargetPath)
net start P2PSN.Bridge.Service

"Exit / b 0" означает, что, даже если служба не установлена, она не потерпит неудачу. Аналогично, если вы еще не создали сервис, он все равно будет работать. После первого раза обе эти команды, очевидно, будут успешными.

чтобы получить эту работа необходимо запустить VISUAL STUDIO с повышенными разрешениями.

надеюсь, что это помогает.


чтобы построить на решении Джима Гримметта и использовать его с .net 4.0, предварительная сборка становится:

net stop yourServiceName

%WinDir%\Microsoft.NET\Framework\v4.0.30319\InstallUtil / u " $(TargetPath)"

выход /b 0

и для post build:

%WinDir%\Microsoft.NET\Framework\v4.0.30319\InstallUtil /i " $(TargetPath)"

net start yourServiceName

rem Exit / b 0

к сожалению $(FrameworkDir) не расширился в путь .net 4.0