Как мне отформатировать вывод моего многомерного массива с цветами на основе значения? - PullRequest
0 голосов
/ 06 февраля 2019

Я использую сценарий Powershell, чтобы получить список серверов в домене Active Directory, опросить их, чтобы определить, установлена ​​ли роль SMTP-сервера, а затем вывести этот список на дисплей несколькими способами.

Я хочу отформатировать вывод сценария, чтобы использовать цвета на основе значений.

Я создаю собственный PSO-объект с выводом, который состоит из двух свойств, которые просто называются «Имя» и «IsInstalled».».Имя - это строковое поле, а 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 голосов
/ 06 февраля 2019

Чтобы сделать это, вам нужно захватить вывод 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

0 голосов
/ 06 февраля 2019

Какой интересный вопрос!Вы можете использовать параметр color для Write-Host, но это будет работать только для полной линии цвета, так что это не то, что вы хотите.

Последние версии консоли PowerShell поддерживают escape-последовательности VT100 / ANSI , которые можно встраивать в строку для раскрашивания подстроки.Вот тест, чтобы увидеть, поддерживаются ли они:

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

Если нет, то есть некоторые опции, описанные в в этом посте .

Чтобы решить вашу проблему , вы можете встроить эти escape-последовательности в строковое представление свойства IsInstalled в каждом из ваших [PSObject] экземпляров в $Results и выбрать эту строкуа не логическое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...