2010-10-26 31 views
8

Estoy usando eventos de compilación pre y post de mi servicio para desinstalar e instalar el servicio. El único problema es que la primera vez que otro desarrollador utiliza el evento de compilación previa falla, ya que el servicio aún no está instalado.Usar InstallUtil para desinstalar el servicio que no existe

Mi caso acumulación pre corriente que desinstala es

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

¿Cómo puedo usar esto para SOLO desinstalación cuando el servicio ya instalado?

+0

Tal vez me falta algo, pero no sería la prebuild también fallar la primera vez (o en cualquier momento después de una limpia) debido a que el exe que contiene las clases del instalador no se ha construido todavía? –

+0

eso es correcto, pero no he sido la reconstrucción o la limpieza por lo que su estado bien. Pero sacas un buen punto. –

Respuesta

14

Puede utilizar la herramienta Microsoft SC (Sc.exe) para consultar el estado de un servicio o incluso crearlo o eliminarlo. He aquí un artículo sobre el uso de este comando: http://support.microsoft.com/kb/251192

Desde una ventana del símbolo (contenido editado para dar énfasis):

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). 

ejecución de este comando para consultar un servicio que existe (A) y (B) no existe resultados en:

(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. 

Por lo tanto, se puede comprobar la existencia de un servicio antes de intentar eliminarla utilizando la siguiente - (perdón por el uso de repulsión del FOR, no estoy muy seguro de cómo capturar la salida del comando sc en una variable o utilizarlo en una instrucción 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% 
+0

tuve jugar con detener e iniciar el servicio para que esto funcione, pero aparte de eso, era perfecto. Gracias :) –

+0

contento de que trabajó para usted – dh0well

0

estoy utilizando Visual Studio 2008 para crear un servicio y, al igual que usted, yo quiero que vuelva a instalar el servicio para mí cuando tengo que reconstruirlo

Mi prebuild es

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

Mi puesto de construcción es

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

El "Salir/b 0" significa que, incluso si el servicio no está instalado, no se producirá un error. Del mismo modo, si aún no ha creado el servicio, seguirá funcionando. Después de la primera vez ambos comandos obviamente tendrán éxito.

Para que esto funcione, DEBE REALIZAR VISUAL STUDIO con ELEVADOS PERMISOS.

Espero que esto ayude.

+0

usarlo con .NET 4.0 se convierte en el prebuild: – dmihailescu

0

para construir sobre solución de Jim Grimmett y utilizarlo con .NET 4.0 se convierte la acumulación previa:

net stop yourServiceName

% windir% \ Microsoft.NET \ Framework \ v4.0.30319 \ installutil/U "$ (targetPath)"

Salir/b 0

y para el puesto de construcción:

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

net start yourServiceName

REM Salir/b 0

por desgracia, el $ (FrameworkDir) no se expandió en el .NET 4.0 trayectoria

Cuestiones relacionadas