如何在Powershell中格式化DataTable对象的输出

如何在Powershell中格式化DataTable对象的输出,powershell,exchange-server,Powershell,Exchange Server,因此,我试图使用基于不同条件的颜色,使用普通的ol'空格和制表符,将一些输出格式化到控制台,很快发现我创建了太多的“if”和“elseif”语句。这并不漂亮。我也没有完成它,因为数据表中有太多的“列”,表中每个列的值的长度属性可以在6到20个字符之间变化。真的很难看。那就是我开始尝试使用DataTable对象的时候。我有这样的想法: $queueTable = New-Object System.Data.DataTable $Queue.Columns.Add("Identity",[stri

因此,我试图使用基于不同条件的颜色,使用普通的ol'空格和制表符,将一些输出格式化到控制台,很快发现我创建了太多的“if”和“elseif”语句。这并不漂亮。我也没有完成它,因为数据表中有太多的“列”,表中每个列的值的长度属性可以在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”,而不是行中的数据。我还尝试了使用
写入输出
,这实际上输出了数据,但不美观,也不允许使用颜色进行格式化

当我运行
$queueTabel | Format Table
时,它以我想要的表格格式提供输出,但它不允许我进行条件格式设置


请记住,我正试图将其写入控制台,因此Out GridView、DataGrid或DataGridView将不起作用。

正如我所理解的,我们必须根据列中的值为特定行着色。 下面提出的解决方案创建了一个并行的“字符串数组”,用于创建彩色输出。也许循环中的代码也可以优化

# 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 }
}

我相信您必须这样循环:
foreach($queueTable.Rows中的row){…}
仍然输出“System.Data.DataRow”Try
Write Host$row.ItemArray
或者如果您希望值用逗号分隔,类似这样:
Write Host($row.ItemArray-join',')
尝试写下的确实是“ItemArray”,但不是一个很好的格式。我真的需要一张桌子,或者至少这是目标。这会很有趣。我将试一试并让您知道。是
$tableTest=$queueTable | Format Table | Out String-Stream
行起了作用!谢谢我将不得不进一步研究这意味着什么。它也适用于原始的
$queues
对象,供阅读本文的其他人参考。因此,您可以放弃创建代码的新表部分,使用
$tableTest=$queues | Format table | Out String-Stream