Llego tarde, pero me gustaría agregar una alternativa, que puede parecer extraña, pero no vi otra forma:
Al instalar mis Servicios de Windows en un proceso de CI cada noche, necesitaba algo que funcionara todo el tiempo y que estuviera completamente automatizado. Por alguna razón, los servicios siempre se marcaron para su eliminación durante mucho tiempo (5 minutos o más) después de desinstalarlos. Por lo tanto, extendí el script por lotes de reinstalación para asegurarme de que el servicio realmente se elimina (versión simplificada):
REM Stop the service first
net stop My-Socket-Server
REM Same as installutil.exe, just implemented in the service
My.Socket.Server.exe /u
:loop1
REM Easy way to wait for 5 seconds
ping 192.0.2.2 -n 1 -w 5000 > nul
sc delete My-Socket-Server
echo %date% %time%: Trying to delete service.
if errorlevel 1072 goto :loop1
REM Just for output purposes, typically I get that the service does not exist
sc query My-Socket-Server
REM Installing the new service, same as installutil.exe but in code
My.Socket.Server.exe /i
REM Start the new service
net start My-Socket-Server
Lo que puedo ver es que el servicio está marcado para su eliminación durante aproximadamente 5 minutos (!) Hasta que finalmente se completa. Finalmente, no necesito más intervenciones manuales. Extenderé el script en el futuro para que algo suceda después de un cierto tiempo (por ejemplo, notificación después de 30 minutos).