【问题标题】:Programmatically change PowerShell's 16 default console colours以编程方式更改 PowerShell 的 16 种默认控制台颜色
【发布时间】:2016-03-20 16:25:33
【问题描述】:

PowerShell 改进了(坦率地说)丑陋的 Windows 控制台配色方案,为其 16 种控制台颜色中的一种分配了蓝色值( - 由于某种原因称为 DarkMagenta - ),并将其用作默认屏幕背景。

我想以编程方式将 16 种颜色中的每一种更改为自定义配色方案。例如,在我的 PowerShell 配置文件中。

我找到了有关如何更改将 ConsoleHost 的 16 种颜色中的哪一种分配给不同类型文本的解释,但我想要实际将 ConsoleHost 的 16 种颜色中的每一种更改为不同的十六进制值。 (仅供我本人使用,不适用于其他用户或其他控制台,例如cmd.exe。)

当然,这可以通过右键单击菜单栏并手动调整“属性”或“默认”设置来完成,但这很快就会让人厌烦。而且我无法找到这些设置持续存在的位置。

(我已经搜索了注册表和C:\Users\<current_user>\AppData,除了HKCU:\Console下的ColorTable##属性,其范围明显比PowerShell控制台设置要宽。)

如果有人可以提供帮助,将不胜感激。

【问题讨论】:

    标签: powershell colors customization


    【解决方案1】:

    控制台颜色在多个地方定义:

    • 全局/默认HKCU:\Console。这适用于所有conhost.exe 应用程序,包括cmd.exepowershell.exe
    • 每个进程: HKCU:\Console\<PROCESS_PATH_WITH_UNDESCORE> 用于特定于进程的更改。前任。 HKEY_CURRENT_USER\Console\%SystemRoot%_System32_WindowsPowerShell_v1.0_powershell.exe 已定义并已修改 ColorTable05ColorTable06
    • 每个快捷方式:在快捷方式 (.lnk) 内。这很难以编程方式修改,可能需要 P\Invoke。

    您可以使用 PS 修改进程级值:

    Set-ItemProperty -Path "HKCU:\Console\%SystemRoot%_System32_WindowsPowerShell_v1.0_powershell.exe" -Name ColorTable04 -Value 5645313
    

    请注意,要查看进程级别的值,您需要使用运行、Windows 资源管理器等启动 PS。如果您使用其中一种快捷方式,则将使用快捷方式的值。因此,修改快捷方式并为新设置保留一份副本可能会更容易。

    每个“ColorTable”都有一个硬编码在System.ConsoleColor-enum 中的名称,因此他们使用名为 DarkMagneta 的名称只是“随机”的。可能是因为它是一种独特的颜色,很少使用。

    【讨论】:

    • 正确,我的答案底部的链接中讨论了每个进程的方法。 OP提到他已经通过了所有这些链接,但是2.5天后仍然没有解决问题。不清楚为什么,因为这些方法对其他人都有效......
    • 我需要的是解释上述内容的权威来源。我所能找到的只是没有解释底层系统逻辑的“提示和技巧”。是否有我可以阅读的书籍、标准或文档资源来解释上述内容?无论如何,感谢弗罗德和科里!
    • 今天这个对我有帮助,谢谢!不管多么麻烦,我使用这些将我拥有的颜色配置文件从一台机器转移到另一台机器。我想补充一点,您从windows + x 菜单调用的 Power Shell 实际上会启动一个快捷方式,该快捷方式位于:%APPDATA%\Microsoft\Windows\Start Menu\Programs\Windows PowerShell
    • 有没有办法读取每个“ColorTable”值的当前有效值,以及(理想情况下)它的来源?
    • 另外:有没有办法告诉使用哪个进程键,因为似乎有一些反向环境变量插值在起作用?
    【解决方案2】:

    我搜索了“更改 powershell 控制台颜色”并找到了大量示例。

    也许这就是你要找的东西:

    How can I set the PowerShell console background color

    $Host.UI.RawUI.BackgroundColor = ($bckgrnd = 'DarkBlue')
    $Host.UI.RawUI.ForegroundColor = 'White'
    $Host.PrivateData.ErrorForegroundColor = 'Red'
    $Host.PrivateData.ErrorBackgroundColor = $bckgrnd
    $Host.PrivateData.WarningForegroundColor = 'Magenta'
    $Host.PrivateData.WarningBackgroundColor = $bckgrnd
    $Host.PrivateData.DebugForegroundColor = 'Yellow'
    $Host.PrivateData.DebugBackgroundColor = $bckgrnd
    $Host.PrivateData.VerboseForegroundColor = 'Green'
    $Host.PrivateData.VerboseBackgroundColor = $bckgrnd
    $Host.PrivateData.ProgressForegroundColor = 'Cyan'
    $Host.PrivateData.ProgressBackgroundColor = $bckgrnd
    Clear-Host
    

    还有关于这个话题的另一个讨论:

    Setting Powershell colors with hex values in profile script

    【讨论】:

    • 在我搜索该主题的 2.5 天里,我实际上遇到了所有这些材料。忘记$Host.UI.RawUI.BackgroundColor 的值。我要更改的是DarkBlue 的值。这很容易通过右键单击菜单栏来完成,但是这些自定义保存在哪里?不在 Lee Holmes 引用的注册表项中,因为它不在我的系统中。
    • 如果密钥不存在,您是否尝试创建密钥,以便根据我对 SO 的现有答案的答案中的最后一个链接进行此类似问题的工作?
    【解决方案3】:

    我为 Windows 控制台颜色制作了一个实用程序,名为 Concfg

    它可以从 JSON 预设文件中导入颜色,并负责从注册表和 .lnk 文件中删除覆盖。

    【讨论】:

      猜你喜欢
      • 2016-10-30
      • 1970-01-01
      • 2016-09-20
      • 2012-07-07
      • 2011-10-21
      • 2015-12-06
      • 2021-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多