如何在PSObject输出中为变量着色

时间:2014-07-03 10:37:47

标签: powershell

如何只用变量$ server?

为红色

像Add-Member Noteproperty -name Server -value(Write-Host $ server -foregroundcolour red)

$object = New-Object PSObject
$object | Add-Member Noteproperty -name User -value $user
$object | Add-Member Noteproperty -name Server -value $server
$object |fl

由于

2 个答案:

答案 0 :(得分:1)

你不能开箱即用。着色或-ForegroundColor-BackgroundColor开关仅适用于Write-Host cmdlet。
您必须编写一个自定义函数来处理来自$object的值,并使用Write-Host将它们写入控制台。

答案 1 :(得分:1)

如果有人想知道,如果您的控制台支持 VT (Virtual Terminal) escape sequences,您可以直接使用它。

原始帖子使用 New-Object,这被认为是 legacy approach。因此,在我的示例中,我将使用 [PSCustomObject] 类型来转换 [ordered]hashtable

对于 VT 颜色,我引用了我找到的 StackExchange's SuperUser post
此外,我将 ESC[0m(以 $esc[0m 的形式)添加到 VT 命令的末尾以重置颜色。

# Grab some data to work with
# NOTE: This grabs either the domain name or Windows workgroup name
$domain = (Get-CimInstance -ClassName "Win32_ComputerSystem").Domain

$boolDomainJoined = (Get-CimInstance -ClassName "Win32_ComputerSystem").PartOfDomain

# VT (Virtual Terminal) escape sequences
$esc = [char]27
$grayDark = 90
$greenBright = 92
$redBright = 91

# New empty object
$objHT = [PSCustomObject][ordered]@{}

# Get fancy and even colorize the custom property name
$objHT | Add-Member -MemberType NoteProperty -Name "$esc[${grayDark}m$("Computer name")$esc[0m" -Value $env:COMPUTERNAME

# Check if computer is part of a domain
if ($boolDomainJoined) {
    $objHT | Add-Member -MemberType NoteProperty -Name "Domain" -Value "$esc[${greenBright}m$($domain)$esc[0m"
} else {
    $objHT | Add-Member -MemberType NoteProperty -Name "Workgroup" -Value "$esc[${redBright}m$($domain)$esc[0m"
}

# Display object as a list
$objHT | Format-List

输出: