В PowerShell, когда я использую Stop-Service для остановки службы Windows, если служба зависает в состоянии «Остановка», Stop-Service зависает на неопределенный срок.
Когда я использую метод ServiceController.Stop(), а служба зависает в состоянии «Остановка», она пытается продолжить работу за этой строкой и перейти к функции ServiceController.WaitForStatus().
Документы Microsoft, похоже, не содержат подробностей с описаниями. Stop-Service и функция Stop() используют ServiceController.
Итак, Stop-Service ожидает, пока служба вернет статус остановки, поэтому использование WaitForStatus с ним является излишним? А Stop() просто отправляет команду остановки, но не знает результата?
В чем разница между этими двумя методами и где можно использовать один вместо другого?
ServiceController
— это класс .Net, где Stop-Service
— это PowerShell CmdLet, который включает в себя некоторые функции ServiceController, чтобы упростить его использование в PowerShell. Например, Stop-Service
будет взаимодействовать с конвейером PowerShell.
ServiceController.Stop()
только сообщает службе и ее зависимостям об остановке, но не ждет их остановки. Как вы говорите, вы можете дождаться остановки службы, используя ServiceController.WaitForStatus(Stopped)
.
Stop-Service
звонит ServiceController.Stop()
и ServiceController.WaitForStatus(Stopped)
для вас. Таким образом, он блокируется до тех пор, пока служба не завершит остановку. Если не хотите ждать, ставьте Stop-Service -NoWait
.
Обычно при использовании PowerShell всегда используйте Stop-Service
, поскольку ServiceController
будет считаться API более низкого уровня.
Stop-Service
— это командлет, а не метод. Командлеты обычно ориентированы на задачи и оснащены наворотами, необходимыми для взаимодействия с конвейерами PowerShell. Внутри он вызываетServiceController.Stop()
и опциональноServiceController.WaitForStatus()