Estou atrasado, mas gostaria de adicionar uma alternativa, que pode parecer estranha, mas não vi outra maneira:
Como instalo meus Serviços do Windows em um processo de IC todas as noites, eu precisava de algo que funcionasse o tempo todo e fosse completamente automatizado. Por alguma razão, os serviços sempre foram marcados para exclusão por um longo período de tempo (5 minutos ou mais) após a desinstalação. Portanto, estendi o script em lotes de reinstalação para garantir que o serviço seja realmente excluído (versão 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
O que posso ver é que o serviço está marcado para exclusão por cerca de 5 minutos (!) Até finalmente ser concluído. Finalmente, não preciso de mais intervenções manuais. Estenderei o script no futuro para que algo aconteça após um certo tempo (por exemplo, notificação após 30 minutos).