【问题标题】:Colorize Powershell Format-List output?着色Powershell格式列表输出?
【发布时间】:2021-10-25 23:02:56
【问题描述】:

我正在尝试用某种颜色突出显示我的 Powershell 命令行开关中的单个输出字段。看起来很简单,也许答案是它不能以简单的方式完成。如果是这样,那很好,只是想看看是否有人知道任何简单的方法来完成所需的输出。

我正在尝试运行的内容(使用 Hashtable 尝试添加颜色):

Get-Mailbox -PublicFolder | Sort Name | FL @{Name='Mailbox Name';Expression={write-host -NoNewline $_.Name -ForegroundColor Green}},Proh*,Issue*,MaxReceiveSize,MaxSendSize,UseDatabaseQ*,Database

在输出中,您会注意到写主机将邮箱的名称放在它的标签之前。 Code with Hashtable

现在对比一下,如果我避免尝试添加颜色(没有哈希表的简化代码):

Get-Mailbox -PublicFolder | Sort Name | FL Name,Proh*,Issue*,MaxReceiveSize,MaxSendSize,UseDatabaseQ*,Database

一切都以完美的格式出现。 Simplified code without Hashtable

有没有办法获得标准的 FL 格式,但为该输出添加颜色?

回应:

致 Theo,感谢您的成功!感谢您添加多色选项。

致JS2010,感谢您的建议。不幸的是,我没有得到想要的输出。如下所述,我目前在 PS 4.0 上(计划很快升级)。

致 Øyvind,类似于 JS2010s 代码中看到的问题。这是我从你的建议中得到的。可能又是版本控制问题。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    您可以通过首先将Format-List 输出捕获为变量中的字符串,在换行符处拆分它并自己输出每一行,如下所示:

    $result = Get-Mailbox -PublicFolder | Sort-Object Name | 
              Format-List Name,Proh*,Issue*,MaxReceiveSize,MaxSendSize,UseDatabaseQ*,Database | 
              Out-String
    

    如果您只想为一个属性着色:

    switch -regex ($result -split '\r?\n') {
        '^Name\s*:' { 
                $label,$value = $_ -split ':',2 
                Write-Host ($label + ":") -NoNewline
                Write-Host $value -ForegroundColor Green
        }
        default { $_ }
    }
    

    输出:

    如果您希望能够为更多属性着色,请使用属性名称和要使用的颜色创建一个哈希表:

    $propertyColors = @{
        Name        = 'Green'
        MaxSendSize = 'Cyan'
    }
    
    switch ($result -split '\r?\n') {
        default { 
            if (![string]::IsNullOrWhiteSpace($_)) {
                $label,$value = $_ -split ':',2 
                if ($propertyColors.ContainsKey($label.Trim())) {
                    Write-Host ($label + ":") -NoNewline
                    Write-Host $value -ForegroundColor $propertyColors[$label.Trim()]
                }
                else { $_ }
            }
            else  { $_ }
        }
    }
    

    输出:

    【讨论】:

    • 感谢您的帮助 Theo,您的建议对我有用。非常感谢。
    • 我不熟悉正则表达式,有没有办法让我尝试分解这段代码并了解你的代码在做什么?
    • @MichaelB。当然。 '\r?\n' 上的拆分只是将多行文本拆分为换行符,无论它是 Windows 格式 (CRLF) 还是 *nix 格式 (LF) 以获得文本行数组。 '^Name\s*:' 是一个测试,它说:从行的开头 (^) 检查它是否以 'Name' 开头,后跟零个或多个空格字符 (\s*),然后是冒号 (:)。如果是这种情况,请执行大括号之间的操作。否则,执行default 开关选项后指定的任何操作(在这种情况下,只需按原样输出该行)
    【解决方案2】:

    js2010 的提示和变量插值可以解决问题!

    $e = [char]0x1b # escape
    Get-Mailbox -PublicFolder | Sort Name | FL @{Name='Mailbox Name';Expression={"$e[32m$($_.Name)$e[0m"}},Proh*,Issue*,MaxReceiveSize,MaxSendSize,UseDatabaseQ*,Database
    

    【讨论】:

      【解决方案3】:

      我的第一次尝试。如果你想度过难关。可能有一个 powershell 模块可以着色(Pansies?)。 Write-host 不写入标准输出,重定向会带走颜色。

      $e = [char]0x1b # escape
      [pscustomobject]@{a = "$e[32mhi$e[0m"} | format-table
      

      输出(假装'hi'是绿色的):

      a
      -
      hi
      

      【讨论】:

      • JS2010,感谢您的帮助。您的代码在 PS 4.0 中有效吗?我没有得到想要的输出。我们计划在未来几个月内升级到 5.1。但是现在我正在使用 4.0。不确定这是否会影响我的输出与您的输出不同的原因。 [PS] C:\Windows\system32>$e = [char]0x1b # 转义 [PS] C:\Windows\system32>[pscustomobject]@{a = "$e[32mhi$e[0m"} |格式表 a - ←[32mhi←[0m
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      • 1970-01-01
      • 2020-04-27
      • 1970-01-01
      • 2023-01-13
      • 2022-07-20
      • 2020-01-08
      相关资源
      最近更新 更多