如何使用基于值的颜色来格式化多维数组的输出?

时间:2019-02-05 23:31:32

标签: arrays powershell sorting multidimensional-array colors

我正在使用Powershell脚本提取Active Directory域中的服务器列表,对其进行轮询以确定是否已安装SMTP服务器角色,然后以几种方式将该列表输出到显示器。

我想格式化脚本的输出以使用基于值的颜色。

我正在使用输出创建一个自定义PSObject,该输出包含两个分别名为“名称”和“ IsInstalled”的属性。 Name是一个字符串字段,IsInstalled是一个布尔值。如果IsInstalled值为False,我希望两个值都显示为红色,如果True,我希望两个值都显示为绿色。

import-module ServerManager
import-module ActiveDirectory

$Computers = Get-ADComputer -Filter {(OperatingSystem -like "*windows*server*") -and (OperatingSystem -notlike "*2003*") -and (Enabled -eq "True")} -Properties Name,OperatingSystem | Select Name | Sort-Object -Property Name #| Select-Object -First 5
$Present = ""
$YesCount = $null
$Results = @()
$Count = 0

ForEach ($Computer in $Computers)
    {
        $Name = $Computer.Name
        $SMTP = Get-WindowsFeature "smtp-server"
        $IsInstalled = $null
        if($SMTP.Installed)
            {
            Write-host "SMTP is installed on $Name"
            $Present = "True"
            $IsInstalled = $True
            $YesCount++
            }
        else
            {
            Write-host "Not on $Name"
            $IsInstalled = $False
            }
        $object = New-Object -TypeName PSObject
        $object | Add-Member -MemberType NoteProperty -Name Name -Value $Name
        $object | Add-Member -MemberType NoteProperty -Name IsInstalled -Value $IsInstalled
        $Results += $object
        $Count++
    }

if (($Present = "True"))
    {
    Write-host ""
    Write-host "Checked $Count machines, and SMTP is installed on no servers!"
    }
else
    {
    Write-host "Checked $Count machines, and SMTP is installed on $YesCount servers!"
    }
$Results |Select Name,IsInstalled | Sort-Object Name | Format-Table -AutoSize

我可以使用Sort-Object和Format-Table来控制输出的排序和布局,但是我不知道如何根据该值更改文本颜色。帮助吗?

2 个答案:

答案 0 :(得分:0)

多么有趣的问题! 您可以将color参数用于Write-Host,但这仅适用于整行颜色,因此不是您想要的。

PowerShell控制台的最新版本支持VT100/ANSI escape sequences,您可以将其嵌入字符串以为子字符串着色。这是一个测试,看是否支持它们:

Write-Host "`e[35m RED `e[0m"

否则,this post中描述了一些选项。

要解决您的问题,您可以将这些转义序列嵌入IsInstalled中每个[PSObject]实例中$Results属性的字符串表示中,并选择该字符串而不是布尔值。

答案 1 :(得分:0)

为此,您需要将Format-Table的输出捕获为数据行的字符串数组,并根据所需的颜色将这些行输出,具体取决于IsInstalled的属性,如下所示:

更改最后一行代码:

$Results |Select Name,IsInstalled | Sort-Object Name | Format-Table -AutoSize

对此:

# format the data and split in into an array. Remove empty or whitespace-only entries
$rows = $Results | Sort-Object Name | Format-Table -AutoSize | Out-String -Stream | Where-Object { $_ -match '\S' }

# write the header and hyphen line below that from the table first
Write-Host
Write-Host $rows[0]
Write-Host $rows[1]

# next, write the data lines ($rows) in the appropriate color
for ($i = 2; $i -lt $rows.Count; $i++) {
    if ($Results[$i - 2].IsInstalled) {
        Write-Host $rows[$i] -ForegroundColor Green
    }
    else {
        Write-Host $rows[$i] -ForegroundColor Red
    }
} 

输出看起来像

enter image description here