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

如何在Powershell控制台中为PSReadLineOption v2使用ANSI转义序列颜色代码?,powershell,colors,psreadline,Powershell,Colors,Psreadline,我正在尝试使用Powershell(v5.1)的内置PSReadLine(v2)模块自定义Powershell控制台文本颜色 PSReadLine的早期版本允许您为任何给定的令牌类型简单地指定-Background和-Foreground参数。但情况已不再如此。PSReadLineV2介绍了使用ANSI转义码来定义颜色行为。我认为这允许更大的灵活性,但对于它的目的来说,这是极其复杂的。关于这些代码的文档随处可见,并且高度依赖于主机应用程序的实现,这使得找到答案变得更加困难 简单地给文本前景上色(

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

PSReadLine的早期版本允许您为任何给定的令牌类型简单地指定
-Background
-Foreground
参数。但情况已不再如此。PSReadLineV2介绍了使用ANSI转义码来定义颜色行为。我认为这允许更大的灵活性,但对于它的目的来说,这是极其复杂的。关于这些代码的文档随处可见,并且高度依赖于主机应用程序的实现,这使得找到答案变得更加困难

简单地给文本前景上色(相对而言)比较容易:

set-psreadlineoption -colors @{
    CommandColor = "`e[93m"
    CommentColor = "`e[32m"
}
然而,如果你想引入装饰,比如粗体、下划线,或者我特别感兴趣的,背景色和它们的组合,事情会变得更复杂

SelectionColor
(用不同的背景色突出显示所选文本)的默认值是
`e[35;43m
。但这个大提示仍然不足以泄露我正在搜索的语法秘密

事实上是这样的:

您可以指定其他转义序列,包括:
256色
24位颜色
前景、背景或两者皆有
反向,粗体

…但没有提供示例

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

我发现有助于了解这些转义码的来源有:

但我还没能完全理解这些

已解决:

多亏了@LotPings。我错误地认为转义码只能有一定数量的选项。事实上,我可以指定任意数量的选项(或实现目标所需的数量)。例如:

$e = [char]0x1b
"$e[38;2;255;128;128;48;2;128;0;255;4mtest$e[0m"
…将生成单词
test
,该单词的下划线为粉色前景和紫色背景。要分解它,请执行以下操作:

  • 使用
    Get PSReadLineOption
    查看当前设置
  • 某些属性在256/24位颜色模式下没有意义
  • Windows控制台不支持反向(也在WSL中)
Jafrog博客中的代码被翻译成PowerShell

## 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}

谢谢。恐怕我仍然不理解在指定前景色和背景色的同时指定前景色的逻辑。例如,在您的上一个屏幕截图中,
Esc[40;1m
为什么前景色是黄色的?这是否仅仅是因为Powershell控制台呈现粗体(
;1
)黄色,甚至不呈现斜体(
;3
)?实际上有办法指定前景色和背景色吗?我也无法解释为什么默认的
选择颜色(
Esc[35;43
)按原样呈现。黄色可能来自我的双色powershell提示函数,在pwsh中没有此函数是正常的。要一次性指定前/背景,请像selectioncolor那样将它们与分号组合。对于亮绿色背景上的亮红色,
$Esc=[char]0x1b;“$Esc[91;102mEsc[91;102m$Esc[0m”
我明白了。我正在尝试测试这一点,我发现我的困惑部分在于set-psreadlineoption显然根本不起作用。如果我加载控制台,键入
get-psreadlineoption
,然后
set-psreadlineoption-colors@{stringcolor='red'}
,然后再次
get psreadlineoption
stringcolor
的值没有改变,字符串继续使用默认颜色。我用错了吗?FWIW,我现在理解了语法。我错误地假设每个转义字符只能有一组选项,但我现在看到,例如,
 $e=[char]0x1b;“$e[91;103;4mtest$e[0m”
将导致单词测试的前景色为红色,背景为绿色,并带有下划线。现在我只需要弄清楚如何获取
设置psreadlineoption
来保存我的更改。啊哈,我使用的
设置psreadlineoption-colors
不正确。
colors
哈希表使用了
string
等名称,而不是
string颜色
,即使
get psreadlineoption
将它们显示为
stringcolor
Ansi Esc[ sequence (CSI)
              Foreground     Background
No Color     normal bright  normal bright
0  black       30     90      40    100
1  red         31     91      41    101
2  green       32     92      42    102
3  yellow      33     93      43    103
4  blue        34     94      44    104
5  violet      35     95      45    105
6  turqoise    36     96      46    106
7  grey        37     97      47    107