如何以编程方式更改 .lnk 打开的控制台窗口的背景颜色?

如何以编程方式更改 .lnk 打开的控制台窗口的背景颜色?

标题说明了一切。如何以编程方式更改 .lnk 打开的控制台窗口的背景颜色?

例如,使用我之前的脚本回答pintotaskbar.ps1

这将在桌面上创建一个快捷方式:

$shortcutpath         = "$home\desktop\$name.lnk"
$wshshell             = new-object -comobject wscript.shell
$shortcut             = $wshshell.createshortcut($shortcutpath)
$shortcut.targetpath  = $path
$shortcut.save()

这使得快捷方式启动程序的权限得到提升:

$bytes                = [system.io.file]::readallbytes($shortcutpath)
$bytes[0x15]          = $bytes[0x15] -bor 0x20
[system.io.file]::writeallbytes($shortcutpath,$bytes)

我使用此代码将 PowerShell 7.1.1 固定到任务栏:

pintotaskbar.ps1 "C:\Program Files\PowerShell\7\pwsh.exe::PowerShell 7.1.1"

它将“管理员:PowerShell 7.1.1”固定到任务栏,但背景颜色是黑色,我知道 GUI 方式可以将其设为 RGB(1,36,86)

在此处输入图片描述

如何使用命令为快捷方式本身添加背景颜色信息?

感谢您的帮助。


我发现了一些非常有用的东西,我使用这个命令来安装LinkParse3

pip install LnkParse3

它会给你一个命令:lnkparse

用法:lnkparse path\to\somelnkfile.lnk

我用它来解析一些文件并将结果上传到 Google Drive:

https://drive.google.com/file/d/1oJKXnr87pyiyM7So8gLlrTnpwUfsV3g2/view?usp=sharing

我发现所有三个 PowerShell 快捷方式的颜色表均设置为 5645313,并且它们的 RGB 值均为 (1,36,86)。

根据这个答案:https://stackoverflow.com/a/48071483/14636788

指定明确的 RGB 颜色时,COLORREF 值具有以下十六进制形式:

0x00BBGGRR

所以如果我反转 RGB 值的顺序:

PS C:\Windows\System32> [int]"0x562401"
5645313

明白了!

但是该脚本不会修改 .lnk 文件,而且我不太擅长 Python,但我相信通过一些调整我可以让它修改 .lnk 文件...

GitHub 存储库LnkParse3


据我所知,.lnk文件使用[MS-SHLLINK]: Shell 链接 (.LNK) 二进制文件格式

我需要更改的属性是Color Table,它位于:

EXTRA BLOCKSCONSOLE_PROPERTIES_BLOCKColor Table

在一个程序中我需要使用IShellLinkDataList和设置NT_CONSOLE_PROPS属性,但是到目前为止,我发现的所有内容都不允许我使用 PowerShell 修改 .lnk 文件,我仍在调查......

看来我要做的是:IShellLinkDataList::AddDataBlock但是我不知道如何在 PowerShell 中执行此操作,但这应该不难......

我终于找到了一些真正有用的东西:

https://github.com/neilpa/cmd-colors-solarized/blob/master/Get-Link.ps1

尽管我不得不承认它确实很先进且复杂,但我相信我可以理解它并根据我的需要进行调整。


我发现我需要使用 .NET/C# IShellLink 库来实现这一点,使用上面提到的方法;

通过谷歌搜索 ShellLink.cs,我能够找到一堆相关的脚本文件,但是我只理解部分内容,因为我不太熟悉 C#...

那么,如何编写一个 PowerShell 脚本,将 NT_CONSOLE_PROPS 块添加到现有的 .lnk 文件,并根据 ShellLink.cs 文件提供的 RGB 值设置颜色表属性?

答案1

NT_CONSOLE_PROPS 结构包含 16 种颜色 色彩参考 格式显示在ColorTable本文所调用的属性/颜色选项卡中。

默认选择的颜色是第一个,即黑色。

您可以使用已经找到的 PowerShell 脚本来更改链接中的颜色Get-Link.ps1,而无需理解它。

要将黑色改为其他颜色,代码可能如下所示,基于存档的 solarizing 脚本

[CmdletBinding()]
    param($Path = "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Accessories\Windows PowerShell\Windows PowerShell.lnk" )
    # Requires the "Get-Link script"
    $lnk = Get-Link $Path
    $lnk.ConsoleColors[0]  = {new chosen color}
    $lnk.Save()
)

我没有测试过此代码,但根据上述内容,您应该能够使其工作。该脚本Get-Link.ps1已经存在多年,因此现在应该处于稳定状态。

答案2

不幸的是,powershell.exe 没有可以添加到 .lnk 的标志来指定启动时的颜色。您锁定的目标可能正在运行cmd.exe(从黑色开始)以启动 powershell shell。

您可以尝试在HKCU:\Console(从这个答案)。这是屏幕截图中的颜色选择器的功能:

Set-Location HKCU:\Console 
New-ItemProperty . ColorTable00 -type DWORD -value 0x00562401 
New-ItemProperty . ColorTable07 -type DWORD -value 0x00f0edee 

或者将项目添加到 PS 启动时加载的配置文件脚本中:

# print path to profile script
$profile 

# set example console colors in profile .ps1
[console]::backgroundcolor = "darkmagenta"
[console]::foregroundcolor = "darkyellow"

答案3

要改变背景颜色我会尝试这样做:

  1. 跑步cmd
  2. 发出color XX命令 - 可以通过注册表发出一个命令,然后用户才能发出自己的命令
  3. powershell从内部呼叫cmd

相关内容