Powershell 将条件应用于commandlet的输出

Powershell 将条件应用于commandlet的输出,powershell,conditional-statements,commandlet,Powershell,Conditional Statements,Commandlet,我想在成功时输出commandlet Invoke命令的结果,如果结果为null,则添加一条自定义消息。如下所示的代码生成所需的结果,除非出现空响应,否则它不会在该行上输出任何内容 我不能直接通过管道传输到if语句,也不能输出两个相反的条件True和False。是否可以在$null上获得自定义响应,同时不抑制成功时的正常输出 调用命令-ComputerName PC1、PC2、PC3-Scriptblock{get eventlog system |其中对象{$\ u0.eventid-eq 1

我想在成功时输出commandlet Invoke命令的结果,如果结果为null,则添加一条自定义消息。如下所示的代码生成所需的结果,除非出现空响应,否则它不会在该行上输出任何内容

我不能直接通过管道传输到if语句,也不能输出两个相反的条件True和False。是否可以在$null上获得自定义响应,同时不抑制成功时的正常输出

调用命令-ComputerName PC1、PC2、PC3-Scriptblock{get eventlog system |其中对象{$\ u0.eventid-eq 129}|选择MachineName、eventid、TimeGenerated、Message-last 1}

如果运行示例代码块时假设PC1和PC3具有事件ID,但PC2没有,则输出将跳过PC2

我想输出类似于在这种情况下找不到的事件的内容


将整个内容放在一个循环中,然后通过另一个条件循环运行结果会破坏性能,因此这不是一个理想的解决方案。

我将创建一个新对象,用于从Invoke命令返回。因此,您可以确定,即使事件日志不存在,您也会从每个主机收到一些信息。也许您可以将get eventlog更改为get WinEvent。对于我的任务来说,Get WinEvent比Get eventlog更快


当您获得Invoke命令调用的输出时,对象应该具有由I-C调用添加的PSComputer属性。然后,您可以将其与输入列表进行比较,以生成一条未找到的消息。@Lee_Dailey:计算机将不会出现在Invoke命令的输出中,因为没有可返回的内容。例如,如果您执行Invoke命令-ComputerName'PC1',PC2'-ScriptBlock{}在ScriptBlock中不执行任何操作,您将不会收到输出。@Patrick-请重新阅读我的评论。[咧嘴笑]然后你可以将其与输入列表进行比较…@Lee_Dailey:对,对不起:-@Patrick-没问题。。。这很容易被误读。。。[咧嘴笑]
[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