如何在Powershell控制台中为PSReadLineOption v2使用ANSI转义序列颜色代码?

时间:2019-06-20 05:57:03

标签: powershell colors psreadline

我正在尝试使用Powershell(v5.1)的内置PSReadLine(v2)模块自定义Powershell控制台文本颜色。

以前的PSReadLine版本允许您为任何给定的令牌类型简单地指定-Background-Foreground参数。但是,情况已不再如此。 PSReadLine v2引入了使用ANSI转义码来定义颜色行为的功能。我认为这样做可以提供更大的灵活性,但是要实现的目标却极其复杂。有关这些代码的文档无处不在,并且高度依赖于宿主应用程序的实现,这使得查找答案变得更加困难。

简单地为文本前景着色很容易,例如:

set-psreadlineoption -colors @{
    CommandColor = "`e[93m"
    CommentColor = "`e[32m"
}

但是,如果要引入装饰,例如粗体,下划线或我特别感兴趣的装饰,背景色及其组合,事情会变得更加复杂。

SelectionColor(突出显示具有不同背景颜色的选定文本)的默认值为`e[35;43m。但是,这个大提示仍然不足以背叛我正在寻找的语法秘密。

doc for Set-PSReadLineOption的真实情况:

  

您可以指定其他转义序列,包括:
  256色
  24位彩色
  前景和/或背景
  反加粗

...但未提供示例。

您将如何指定一个转义代码,该代码定义前景色和背景色,或颜色和彩色装饰的任何其他组合?

我发现有助于了解这些转义码的来源有: http://jafrog.com/2013/11/23/colors-in-terminal.html https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters

但是我无法完全包住所有这些。

已解决:

感谢@LotPings。我错误地认为转义码只能给它们提供一定数量的选项。实际上,我可以指定任意数量(或实现目标所需的数量)。例如:

$e = [char]0x1b
"$e[38;2;255;128;128;48;2;128;0;255;4mtest$e[0m"

...将导致单词test,该单词下划线带有粉红色前景色和紫色背景。分解:

enter image description here

1 个答案:

答案 0 :(得分:1)

  • 使用with tab as( select 'Linehaul' as c1, 3 as val1, 'Trans'as c2, 2 as val2, 'Sort' as c3, 1 as val3 from dual union all select 'Trans', 5, 'Sort', 2 , 'Linehaul', 2 from dual ) select t.* ,case when t.c1 = 'Sort' then val1 when t.c2 = 'Sort' then val2 when t.c3 = 'Sort' then val3 else -1 end as X from tab t 查看当前设置
  • 某些属性在256/24位彩色模式下没有意义。
  • Windows控制台不支持反向(也在WSL中)

Jafrog博客中的代码已翻译为PowerShell

Get-PSReadLineOption

enter image description here

## Q:\Test\2019\06\20\SO_56679782.ps1

Get-PSReadLineOption

$Esc=[char]0x1b 

'The following command should print “hello” in bright red underscore text:'
"$Esc[91;4mHello$Esc[0m"

ForEach($code in 30..37){
"{0}[{1}mEsc[{1}m{0}[0m  {0}[{1};1mEsc[{1};1m{0}[0m  {0}[{1};3mEsc[{1};3m{0}[0m  {0}[{1};4mEsc[{1};4m{0}[0m  {0}[{2}mEsc[{2}m{0}[0m" -f $Esc,$code,($code+60)
}
pause
foreach($code in 0..255){"{0}[38;5;{1}mESC[38;5;{1}m{0}[0m" -f $Esc,$code}

enter image description here