Как отформатировать вывод объекта DataTable в Powershell - PullRequest
0 голосов
/ 15 января 2019

Итак, я пытался отформатировать вывод на консоль , используя цвета, основанные на различных условиях, используя обычные пробелы и табуляции, и быстро обнаружил, что я создавал так много операторов "if" и "elseif" , Это было не красиво. Я также не закончил, потому что в таблице данных так много «столбцов», а свойство length значения каждого столбца в таблице может варьироваться в любом месте от 6 до 20+ символов. Это действительно было ужасно. Вот тогда я начал пытаться использовать объект DataTable. У меня есть что-то вроде этого:

$queueTable = New-Object System.Data.DataTable
$Queue.Columns.Add("Identity",[string]) | Out-Null
#same thing for 5 more columns, just different column names and types

Теперь добавьте данные в таблицу:

$queues = Get-Queue
foreach ($queue in $queues) {
    $NewRow = $queueTable.NewRow()
    $NewRow.Identity = $queue.Identity
    #And so for the next 5 columns
    $queueTable.Rows.Add($NewRow)
}

Теперь я пытаюсь вывести объект DataTable на экран, но отформатированный цветом в зависимости от условия. Вот что у меня есть для этого произведения:

foreach ($row in $queueTable) {
    if ($row.item("MessageCount") -gt 1) {Write-Host -ForegroundColor Red $row
    else {Write-Host $row}
}

Выход для этого кода - просто «System.Data.Row», а не данные внутри строки. Я также попытался использовать Write-Output, и это на самом деле выводит данные, но не красиво, и это также не позволяет форматирование с цветом.

Когда я запускаю $queueTabel | Format-Table, он выдает выходные данные в формате таблицы, как я ищу, но не позволяет мне выполнять условное форматирование.

Помните, я пытаюсь записать это на консоль, поэтому Out-GridView, DataGrid или DataGridView не будут работать.

1 Ответ

0 голосов
/ 15 января 2019

Как я понял, мы должны раскрасить определенные строки на основе значений в столбце. Предлагаемое ниже решение создает параллельный «массив строк», который будет использоваться для создания цветного вывода. Может быть, код в цикле также можно оптимизировать

# Creating the table and adding rows
$queueTable = New-Object System.Data.DataTable
$queueTable.Columns.Add("Identity",[string]) | Out-Null
$queueTable.Columns.Add("MessageCount",[int]) | Out-Null

$queueTable.Rows.Add("test1",1) | Out-Null
$queueTable.Rows.Add("test2",2) | Out-Null
$queueTable.Rows.Add("test3",3) | Out-Null

# convert the datatable to an array of strings
$tableTest = $queueTable | Format-Table | Out-String -Stream

# the first two lines are the header and separator to be printed in any case
$tableTest[0..2] | Write-Host 

# then we process the original datatable rows
# if a row matches the criteria, then we print the related line in $tableText
# using the correct format
for ($i=0; $i -lt $queueTable.Rows.Count; $i++) {
    if ($queueTable.Rows[$i].MessageCount -gt 1) { 
        $tableTest[$i+3] | Write-Host -ForegroundColor Red -NoNewline; Write-Host }
    else { $tableTest[$i+3] | Write-Host -NoNewline; Write-Host }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...