如果值大于100 MB,我尝试将列RAM着色为红色:
Get-Process | Format-Table @{ Label = "PID"; Expression={$_.Id}},
@{ Label = "Name"; Expression={$_.Name}},
@{ Label = "RAM (MB)"; Expression={[System.Math]::Round($_.WS/1MB, 1)}},
@{ Label = "Responding"; Expression={$_.Responding}}
我尝试使用 Write-Host -nonewline ,但结果是错误的。
Get-Process | Format-Table @{ Label = "PID"; Expression={$_.Id}},
@{ Label = "Name"; Expression={$_.Name}},
@{ Label = "RAM (MB)"; Expression={write-host -NoNewline $([System.Math]::Round($_.WS/1MB, 1)) -ForegroundColor red}},
@{ Label = "Responding"; Expression={ write-host -NoNewline $_.Responding -fore red}}
答案 0 :(得分:19)
从PowerShell 5.1或更高版本开始,您可以使用VT escape sequences为单个列添加颜色,但前提是您的控制台支持VT转义序列(例如Windows 10 Fall Creators Update,Linux或Mac,但不支持Windows 8)没有像ConEmu这样的控制台模拟器。
这是一个在表达式中指定格式的示例,尽管可以在ps1xml文件中使用相同的内容:
dir -Exclude *.xml $pshome | Format-Table Mode,@{
Label = "Name"
Expression =
{
switch ($_.Extension)
{
'.exe' { $color = "93"; break }
'.ps1xml' { $color = '32'; break }
'.dll' { $color = "35"; break }
default { $color = "0" }
}
$e = [char]27
"$e[${color}m$($_.Name)${e}[0m"
}
},Length
结果输出,请注意列宽看起来很好,转义序列字符没有多余的空格。
答案 1 :(得分:11)
接受的答案不正确,可以对列进行着色。获取条件列颜色的解决方案是使用Write-PSObject。
Here are some wonderful examples带有文档化的代码和解释。
来自上述资源:
Write-PSObject $servers -MatchMethod Exact -Column "Manufacture" -Value "HP" -ValueForeColor Yellow -ValueBackColor Red -RowForeColor White -RowBackColor Blue;
我通过a GitHub issue to add color formatting to Format-Table找到了这个,这似乎是PowerShell开发人员想要添加的功能。
答案 2 :(得分:8)
filter colorize-row{
Get-Process | Select-Object Id, Name, WS, Responding | foreach {
# Print 'red' row if WS greater than 100 MB
if([System.Math]::Round($_.WS/1MB,1) -match "^([0-9]|[0-9][0-9]|[1-9][0-9]?$|^100$)$"){
[console]::ForegroundColor="white"; $_;
} else {
[console]::ForegroundColor="red"; $_;
}
}
}
colorize-row
答案 3 :(得分:4)
快速回答是你不能。可以使用Write-Host颜色,但没有“输出”发送到格式表。
来自Write-Host的“输出”是一种副作用,它将数据直接发送到控制台,而不是像标准函数那样将其返回给调用者。
结合@David Martin的评论,这里的a link有一个有趣的模式匹配格式 - 颜色函数。
答案 4 :(得分:0)