标题说明了一切。如何以编程方式更改 .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 BLOCKS
→ CONSOLE_PROPERTIES_BLOCK
→Color 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
要改变背景颜色我会尝试这样做:
- 跑步
cmd
- 发出
color XX
命令 - 可以通过注册表发出一个命令,然后用户才能发出自己的命令 powershell
从内部呼叫cmd