Упрощенная команда PS: Get-Service | где {($ _. Status -eq "Stopped") -OR ($ _. Status -eq "Running")} - PullRequest
5 голосов
/ 01 апреля 2011

Каков синтаксис для включения нескольких значений в команду -eq:

Это работает, но я думаю, что есть способ сэкономить на наборе:

Get-Service | where {($_.Status -eq "Stopped") -OR ($_.Status -eq "Running")}

Думаю, что код должен выглядеть, но я точно не помню синтаксис:

Get-Service | where {($_.Status -eq "Stopped"|"Running"|"...")}

Ответы [ 3 ]

6 голосов
/ 01 апреля 2011

Вы можете использовать -contains и псевдоним gsv:

gsv | where-object {@("Stopped","Running") -contains $_.Status}

EDIT : Вы также можете использовать оператор -match:

gsv | where-object {$_.Status -match "Stopped|Running"}

2.EDIT : более короткая версия с особой благодарностью @Joey:

gsv | ? {$_.Status -match "Stopped|Running"}
2 голосов
/ 11 ноября 2015

Как заявлено @OcasoProtal, вы можете сравнить массив действительных статусов с вашим целевым статусом, используя операторы -contains или -notcontains.

Данный статус основан на типе перечисления, вы также можете использовать это(то есть в отличие от использования сравнения строк).Это добавляет дополнительную проверку (т. Е. Без указания вручную ValidateSet) и позволяет получить список значений из Enum (например, как показано в моем примере кода ниже, где указано Not.

clear-host
[string]$ComputerName = $env:COMPUTERNAME
[string]$ServiceName = "MSSQLSERVER"


function Wait-ServiceStatus {
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [string]$ServiceName
        ,
        [Parameter()]
        [ValidateNotNullOrEmpty()]
        [string]$ComputerName = $env:COMPUTERNAME
        ,
        [switch]$Not
        ,
        [Parameter(Mandatory = $true)]
        [System.ServiceProcess.ServiceControllerStatus]$TartgetStatus
    )
    begin {
        [System.ServiceProcess.ServiceControllerStatus[]]$TargetStatuses = @($TartgetStatus)
        if ($Not.IsPresent) {

            #EXAMPLE: Build your comparison array direct from the ENUM
            $TargetStatuses = [Enum]::GetValues([System.ServiceProcess.ServiceControllerStatus]) | ?{$_ -ne $TartgetStatus}

        }
    }
    process {

        #EXAMPLE: Compare status against an array of statuses
        while ($TargetStatuses -notcontains (Get-Service -ComputerName $ComputerName -Name $ServiceName | Select -Expand Status)) {

            write-host "." -NoNewline -ForegroundColor Red
            start-sleep -seconds 1
        }
        write-host ""
        #this is a demo of array of statuses, so won't bother adding code for timeouts / etc 
    }
}
function Write-InfoToHost ($text) {write-host $text -ForegroundColor cyan} #quick thing to make our status updates distinct from function call output

Write-InfoToHost "Report Current Service Status"
get-service -Name $ServiceName -Computer $ComputerName | Select -ExpandProperty Status
Write-InfoToHost ("Stop Service at {0:HH:mm:ss}" -f (get-date))
(Get-WmiObject Win32_Service -Filter "name='$ServiceName'" -Computer $ComputerName).StopService() | out-null #use WMI to prevent waiting
Write-InfoToHost ("Invoked Stop Service at {0:HH:mm:ss}" -f (get-date)) 
Wait-ServiceStatus -ServiceName $ServiceName -TartgetStatus Stopped 
Write-InfoToHost ("Stop Service Completed at {0:HH:mm:ss}" -f (get-date)) 

Write-InfoToHost "Report Current Service Status" 
get-service -Name $ServiceName -Computer $ComputerName | Select -ExpandProperty Status

Write-InfoToHost ("Start Service at {0:HH:mm:ss}" -f (get-date)) 
(Get-WmiObject Win32_Service -Filter "name='$ServiceName'" -Computer $ComputerName).StartService() | out-null  #use WMI to prevent waiting
Write-InfoToHost ("Invoked Start Service at {0:HH:mm:ss}" -f (get-date))
Wait-ServiceStatus -ServiceName $ServiceName -Not -TartgetStatus Stopped 
Write-InfoToHost ("Service Not Stopped at {0:HH:mm:ss}" -f (get-date))
Wait-ServiceStatus -ServiceName $ServiceName -Not -TartgetStatus StartPending
Write-InfoToHost ("Service Not Start-Pending at {0:HH:mm:ss}" -f (get-date))
Write-InfoToHost "Report Current Service Status"
get-service -Name $ServiceName -Computer $ComputerName | Select -ExpandProperty Status

Пример вывода:

Report Current Service Status
Running
Stop Service at 12:04:49
Invoked Stop Service at 12:04:50
.
Stop Service Completed at 12:04:51
Report Current Service Status
Stopped
Start Service at 12:04:51
Invoked Start Service at 12:04:52

Service Not Stopped at 12:04:52
..
Service Not Start-Pending at 12:04:54
Report Current Service Status
Running

Вы также можете легко получить статусы Ожидание или «Стабильное состояние», используя что-то вроде этого:

function PendingDemo([bool]$Pending) {
    write-host "Pending is $Pending" -ForegroundColor cyan
    [Enum]::GetValues([System.ServiceProcess.ServiceControllerStatus]) | ?{($_ -notlike "*Pending") -xor $Pending}
}

PendingDemo $true
""
PendingDemo $false

Пример вывода:

Pending is True
StartPending
StopPending
ContinuePending
PausePending

Pending is False
Stopped
Running
Paused
1 голос
/ 02 апреля 2011

сопоставление по группам регулярных выражений - самый короткий и безопасный способ всегда.Вы также можете использовать дополнительные:

gsv | ? {$_.status -notmatch "Paused|Running_Pending|Pause_Pending|Stop_Pending|Continue_Pending"}

В этом случае, очевидно, это не самое короткое;но иногда это так!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...