Я опоздал, но хотел бы добавить альтернативу, которая может выглядеть странно, но я не видел другого пути:
Поскольку я устанавливал свои службы Windows в процессе CI каждую ночь, мне нужно было что-то, что работает постоянно и полностью автоматизировано. По какой-то причине службы всегда были отмечены для удаления в течение длительного времени (5 минут и более) после их удаления. Поэтому я расширил пакетный скрипт переустановки, чтобы убедиться, что служба действительно удалена (упрощенная версия):
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
Что я вижу, так это то, что сервис помечен для удаления примерно на 5 минут (!), Пока, наконец, не пройдет. Наконец, мне не нужно больше ручных вмешательств. Я буду расширять сценарий в будущем, чтобы что-то происходило через определенное время (например, уведомление через 30 минут).