Вывод строки выбора имеет @ {в выводе - PullRequest
1 голос
/ 07 марта 2019

Я пытаюсь получить службы, которые находятся в автоматическом режиме, но не работает, и запустить их, за исключением нескольких служб, которые я хочу игнорировать в скрипте, чтобы проверить, есть ли выход для получения желаемого результата при правильном форматировании, как как видно на рисунке 2, из-за вывода строки выбора мой сценарий не может принять service.name в качестве переменной. я использую команду ниже

Get-CimInstance win32_service -Filter "startmode = 'auto' AND state != 'running' "  | select name, startname, exitcode | Select-String   "gupdate|RemoteRegistry"  -NotMatch

вывод, который я получаю

но желаемый результат равен

ниже мой сценарий

    $Services = Get-CimInstance win32_service -Filter "startmode = 'auto' AND state != 'running' "  | select name, startname, exitcode | Select-String  -Pattern "gupdate|RemoteRegistry" -NotMatch
$ServicesRunning = Get-CimInstance win32_service -Filter "state = 'running'"
if ([string]::IsNullOrEmpty($Services)){
    Write-Output "OK: All services running | ServicesRunning=$($ServicesRunning.Count);0;0;0;0"
    $host.SetShouldExit(0)
}
else{
    $ServicesStopped=""
    ForEach ($Service in $Services){
        Start-Service @($Service.Name) -ErrorAction SilentlyContinue | Out-Null  
        if ($(Get-Service -Name ($Service.Name)).Status -eq "running"){
            $ServicesStopped += "($Service.Name)(Started manually),"
            If ($ExitCode -eq 0){
                $ExitCode = 1
            }
        }
        Else{
            $ServicesStopped += "$($Service.Name)(Stopped),"
            $ExitCode = 2
        }
    }
    If ($ExitCode -eq 2){
        Write-Output "CRITICAL: Service(s) stopped: $($ServicesStopped.TrimEnd(",")) | ServicesRunning=$($ServicesRunning.Count);0;0;0;0"
        $host.SetShouldExit(2)
    }
    Else{
        Write-Output "WARNING: Service(s) stopped: $($ServicesStopped.TrimEnd(",")) | ServicesRunning=$($ServicesRunning.Count);0;0;0;0"
        $host.SetShouldExit(1)
    }
}

1 Ответ

0 голосов
/ 07 марта 2019

Select-String ожидает строку или список строк в качестве ввода.Select-Object создает список пользовательских объектов.Подсоединение последнего к первому приводит к тому, что вывод последнего преобразуется в строку.Что, очевидно, не то, что вы хотите.И в любом случае это не нужно, поскольку вы можете выполнять всю фильтрацию напрямую с помощью параметра Get-CimInstance -Filter:

$fltr = "name!='gupdate' AND name!='RemoteRegistry'" + 
        " AND startmode='auto' AND state!='running'"

Get-CimInstance Win32_Service -Filter $fltr |
    Select-Object Name, StartName, ExitCode
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...