Как обеспечить, чтобы служба была остановлена ​​или запущена с помощью PowerShell? - PullRequest
0 голосов
/ 13 февраля 2019

Я запускаю задачу в VSTS/Azure DevOps конвейере, чтобы остановить и удалить список оконных служб.То, что я делаю здесь, это выполнение кода ниже и использование метода сна, чтобы убедиться, что вышеуказанный метод был завершен.

Function DeleteService([string] $ServiceName) 
{
    TRY{

        $Service = Get-WmiObject -Class Win32_Service -Filter "Name='$ServiceName'"  

        if ($Service -ne $null) 
        {
            Write-Output "Stopping window service - '$ServiceName'"         
            $Service.StopService()     
            # Adding a sleep for ten seconds to let the process stop the service completely
            Start-Sleep -m 10000 
            Write-Output "Stopping Window service - '$ServiceName' completed"   


            Write-Output "Uninstalling window service - '$ServiceName'"         
            $Service.Delete()   
            # Adding a sleep for ten seconds to let the process stop the service completely
            Start-Sleep -m 10000
            Write-Output "Uninstalling window service - '$ServiceName' completed"   

        } 
        else 
        {
            Write-Output "Window service - '$ServiceName' does not exist. Uninstallation Complete"
        }
    }
    CATCH
    {
        $ErrorMessage = $_.Exception.Message    
        Write-Error " ********************** Error in uninstalling window service : $ServiceName with exception $ErrorMessage ********************** "
    }
}

Нет ли лучшего способа в PowerShell, который подтвердил бы, что служба остановлена, теперь я могу продолжить.Так что мне не нужно помещать такие патчи в код.

Потому что, как я изучил на сайте Microsoft , эти команды отправляют сообщение на Windows Service Controller.Они не завершают задачу.Поэтому я сомневаюсь, что как написать такой код, который будет работать синхронно с правильным своевременным выполнением.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Если вы используете PS v6, вы можете просто использовать Remove-Service, так как это остановит и удалит службу:

if (Get-Service $ServiceName -ErrorAction SilentlyContinue) {
    Remove-Service $ServiceName -Verbose
} 
else {
    Write-Output "Window service - '$ServiceName' does not exist. Uninstallation Complete"
}

Если вы используете более низкую версию, я бы использовал Stop-Service& Get-CimInstance (вместо Get-WmiObject):

if (Get-Service $ServiceName -ErrorAction SilentlyContinue) {
    Stop-Service $ServiceName -Verbose
    Get-CimInstance -ClassName Win32_Service -Filter "Name='$ServiceName'" | Remove-CimInstance
} 
else {
    Write-Output "Window service - '$ServiceName' does not exist. Uninstallation Complete"
}
0 голосов
/ 13 февраля 2019

Вместо использования Get-WmiObject вы можете использовать Get-Service и проверить статус службы:

$service = Get-Service -Name 'VSS'
Write-Host $service.Status
# Stopped/Running

Поэтому, если вы хотите убедиться, что служба остановлена, а затем продолжить удаление, выможно обернуть проверку состояния с помощью цикла while.

while ($service.Status -ne 'Running')
{
  ....
}
...