当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 显示 ANSI 示例

作者:精品下载站 日期:2024-12-14 07:58:50 浏览:14 分类:玩电脑

显示 ANSI 示例


本周早些时候,我为 PSPowerHour 进行了现场会议。我讨论了修饰 PowerShell 工作和控制台会话的方法。我谈到的一件事是使用 ANSI 转义序列来添加一些颜色。我意识到我一直在参考 https://en.wikipedia.org/wiki/ANSI_escape_code 上的参考源。在某种程度上,这很好,但我仍然需要查看控制台中的值是什么样子,以确定我是否想使用它。我不知道为什么我没有早点这样做,但我编写了一个快速但肮脏的脚本来从 PowerShell 提示符显示 ANSI 序列。如果你不喜欢这个,野外还有其他的。

#requires -version 5.1
#requires -module PSScriptTools

#Show-ANSI.ps1
#comment out the Add-Border lines if you aren't using the PSScriptTools module.
[cmdletbinding()]
Param(
    [switch]$Basic,
    [switch]$Foreground,
    [switch]$Background,
    [int[]]$RGB
)

# a private function to display results in columns on the screen
Function display {
Param([object]$all,[int]$Max)

    $c = 1
    for ($i=0;$i -le $all.count;$i++) {
        if ($c -gt $max) {
            Write-Host "`r"
            $c=1
        }
        Write-Host "$($all[$i]) `t" -NoNewline
        $c++
    }
}

if ($IsCoreCLR) {
    $esc = "`e"
    $escText = '`e'
    $max = 3
}
else {
    $esc = $([char]0x1b)
    $escText = '$([char]0x1b)'
    $max = 2
}

#basic
if ($basic) {

    Add-Border "Basic Sequences" -ansitext "$esc[1m"

    $basichash = @{
        1 = "Bold"
        2 = "Faint"
        3 = "Italic"
        4 = "Underline"
        5 = "SlowBlink"
        6 = "RapidBlink"
        7 = "Reverse"
        9 = "CrossedOut"
    }

    $basichash.GetEnumerator() | ForEach-Object {
        $sequence = "$esctext[$($_.name)m$($_.value)$esctext[0m"
        #"$esc[$($_.name)m$($_.value)$esc[0m"
        "$esc[$($_.name)m$sequence$esc[0m"
    }
}

If ($Foreground) {

    Add-Border "Foreground" -ansitext "$esc[93m"
    $n = 30..37
    $n+= 90..97

    $all = $n | ForEach-Object {
         $sequence = "$esctext[$($_)mHello$esctext[0m"
        "$esc[$($_)m$sequence$esc[0m"
    }

    display -all $all -Max $max

    Write-Host "`n"
    Add-Border "8-Bit Foreground" -ansitext "$esc[38;5;10m"
    $all = 1..255 | ForEach-Object {
         $sequence = "$esctext[38;5;$($_)mHello$esctext[0m"
        "$esc[38;5;$($_)m$sequence$esc[0m"
    }
      display -all $all -Max $max
}

If ($Background) {

    Add-Border "Background" -ansitext "$esc[46m"
    $n = 40..47
    $n+= 100..107
    $all = $n | ForEach-Object {
         $sequence = "$esctext[$($_)mHello$esctext[0m"
        "$esc[1;$($_)m$sequence$esc[0m"
    }

    display -all $all -Max $max

    Write-Host "`n"
    Add-Border "8-Bit Background" -ansitext "$esc[7;38;5;10m"
    $all = 1..255 | ForEach-Object {
         $sequence = "$esctext[48;5;$($_)mHello$esctext[0m"
        "$esc[1;48;5;$($_)m$sequence$esc[0m"
    }
    display -all $all -Max $max
}

if ($RGB) {

    if ($rgb.count -ne 3) {
        Write-Warning "Wrong number of arguments. Specify RED,GREEN and BLUE values"
        return
    }
    $test = $rgb | Where-object {$_ -gt 255}
    if ($test.count -gt 0) {
        Write-Warning "Detected a value above 255"
        return $rgb
    }

    $r = $rgb[0]
    $g = $rgb[1]
    $b = $rgb[2]

    $sequence = "$esctext[38;2;$r;$g;$($b)m256 Color (R:$r)(G:$g)(B:$b)$esctext[0m"
    "$esc[38;2;$r;$g;$($b)m$sequence$esc[0m"

}

正如我所说,这是一个“快速而肮脏”的解决方案。目的是您可以在 Windows PowerShell 或 PowerShell 7 会话中运行它,并准确查看序列在您的系统上的样子。输出将包括您将使用的确切序列,具体取决于您的 PowerShell 版本。

[玩转系统] 显示 ANSI 示例

您可以测试基本设置。并非每个设置都适用于每个系统。对我来说,看起来我可以使用反向、下划线和粗体。

您可以看到前景选项。

[玩转系统] 显示 ANSI 示例

背景选项:

[玩转系统] 显示 ANSI 示例

我考虑过显示每种 RGB 组合,但意识到这很快就会失控。相反,您可以按 R、G、B 的顺序指定值数组。

[玩转系统] 显示 ANSI 示例

希望对你有帮助。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯