将空值写入红色

Lay*_*nie 3 powershell

我有一个基本命令,用于检查大约 100 个服务器的最近 5 个更新并返回它们的安装日期。如果安装日期为空,我想让脚本返回红色行。

命令是

 Get-WmiObject -Class Win32_QuickFixEngineering -ComputerName $ComputerName | Select-object -Property PSComputerName, @{n='HotFix ID';e={$_.hotfixid}}, @{n='Installation Date';e={$_.installedon}} | select -Last 05
Run Code Online (Sandbox Code Playgroud)

我尝试使用格式颜色但它不起作用。命令的输出如下所示

PSComputerName HotFix ID Installation Date
-------------- --------- -----------------
DC1            KB4132216 10/6/2021 12:00:00 AM

DC1            KB4535680 11/3/2021 12:00:00 AM

DC1            KB4589210

DC1            KB5005698 10/6/2021 12:00:00 AM

DC1            KB5007192 11/16/2021 12:00:00 AM
Run Code Online (Sandbox Code Playgroud)

没有日期的线我想是红色的。这可能吗?

谢谢你!

Sag*_*pre 6

关于您的脚本的一些评论

  • 您正在使用Select -last 05,但您运行的 wmi 命令不会按InstalledOn升序为您提供项目。您获得的 5 项是最后 5 项,但不是从排序的角度来看的。

  • 为了提高效率,您可以组合 2 个 select 语句(例如:Select -Last 5 -Property ...

现在,对于您的实际问题,我将使用 ANSI 转义序列。使用转义字符然后指定虚拟终端序列将允许您修改文本的颜色和其他文本属性,例如粗体和下划线。

这是一个修改后的脚本,它考虑了之前的注释并集成了转义序列以根据需要格式化输出。

$ComputerName = 'localhost'
$HotFixes = Get-WmiObject -Class Win32_QuickFixEngineering -ComputerName $ComputerName 


$ColoringCondition = { 
    Param($Value)
    $e = [char]27 # For PS 5.1 ... In PS 7.0+, this can be removed and occurences of $e below replaced by `e
    if ([String]::IsNullOrEmpty($_.'InstalledOn')) { 
        return "$e[5;31m$($Value)$e[0m"; 
    }
    return $Value 
}


$Last5 = $HotFixes | Sort-Object -Property installedon -Descending | 
Select -First 5 -Property @{'Name' = 'PSComputerName' ; 'Expression' = { . $ColoringCondition $_.PSComputerName  } }, 
@{n = 'HotFix ID'; e = {. $ColoringCondition $_.hotfixid } }, 
installedon

$Last5 # Print output
Run Code Online (Sandbox Code Playgroud)

输出

输出

  • 更新已按InstalledOn属性排序(降序,以便首先显示最新的),并且由于这种排序,我们选择第 5 个项目(5 个最新的)

  • 根据所有属性检查着色条件,如果缺少安装日期,则将着色添加到该行的单元格值中。

注意: 如果您使用的是 Powershell 7+,则无需声明$e = [char]27,只需使用`e(反引号 + e)即可。

笔记2:

作为初始排序(按安装日期降序排序)的副产品,这意味着安装日期为空的所有更新都将进入底部,并且可能永远不会被前 5 个更新选中。我认为,如果他们有如果安装日期为空,它们可能是系统附带的更新,可以安全地忽略,但要记住这一点。

参考:

控制台虚拟终端序列 - 文本格式

在 Powershell 中使用 ANSI 转义序列

Powershell - 关于特殊字符(适用于 PS 7.0+)