Применить условно к выводу командлета - PullRequest
0 голосов
/ 24 октября 2019

Я хочу вывести результат командлета (Invoke-Command) в случае успеха и добавить пользовательское сообщение, если результат равен нулю. Код, показанный ниже, дает желаемые результаты, за исключением случая нулевого ответа, он просто ничего не выводит в этой строке.

Я не могу перенаправить напрямую в оператор if, и не могу вывести при 2 противоположных условиях(Верно и Неверно). Можно ли получить пользовательский ответ на $ null, не подавляя нормальный вывод при успешном завершении?

Invoke-Command -ComputerName PC1, PC2, PC3 -Scriptblock {get-eventlog system | where-object {$_.eventid -eq 129} | select MachineName, EventID, TimeGenerated, Message -last 1}

Если вы запускаете блок кода примера, предполагая, что у ПК1 и ПК3 есть событиеID, но PC2 нет, вывод просто пропустит PC2.

Я хочу вывести что-то вроде «Событие не найдено» в этом случае.

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

1 Ответ

0 голосов
/ 24 октября 2019

Я бы создал новый объект для возврата из Invoke-Command. Таким образом, вы уверены, что получите от каждого хоста что-то, даже нет журнала событий. И вы можете изменить get-eventlog на Get-WinEvent. Get-WinEvent был для моих задач больше всего быстрее, чем get-eventlog.

[System.Management.Automation.ScriptBlock]$Scriptblock = {
    [System.Collections.Hashtable]$Hashtable = @{
        WinEvent = Get-WinEvent -FilterHashtable @{ LogName = 'System'; Id = 129 } -MaxEvents 1 -ErrorAction SilentlyContinue #-ErrorAction SilentlyContinue --> otherwise there is an error if no event is available
    }

    return (New-Object -TypeName PSCustomObject -Property $Hashtable)
}

Invoke-Command -ComputerName 'PC1', 'PC2', 'PC3' -Scriptblock $Scriptblock
...