Как изменить цвет фона окна консоли, открываемого .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» на панели задач, однако цвет фона черный, я знаю способ сделать его RGB (1,36,86) с помощью графического интерфейса.

введите описание изображения здесь

Как можно использовать команду для добавления информации о цвете фона к самому ярлыку?

Спасибо за помощь.


Я нашел кое-что действительно полезное, я использовал эту команду для установки LinkParse3:

pip install LnkParse3

Он дает вам команду: lnkparse

Применение:lnkparse path\to\somelnkfile.lnk

Я использовал его для анализа некоторых файлов и загрузил результат на Google Диск:

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...

Репозиторий GitHubLnkParse3


Из того, что я узнал, .lnkфайлы используют[MS-SHLLINK]: Формат двоичного файла Shell Link (.LNK)

Недвижимость, которую мне нужно изменить Color Table, расположена по адресу:

EXTRA BLOCKSCONSOLE_PROPERTIES_BLOCKColor Table

В программе мне нужно использовать IShellLinkDataListи задавать NT_CONSOLE_PROPSсвойства, однако пока все, что я смог найти, не позволяет мне изменять файлы .lnk с помощью PowerShell, я все еще изучаю...

Кажется, все, что мне нужно сделать, это: 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 и установит атрибут Color Table в соответствии со значением RGB, предоставленным с помощью файла ShellLink.cs?

решение1

The NT_CONSOLE_PROPS структура содержит 16 цветов в ЦВЕТНОЙ формат, который отображается на вкладке Свойства/Цвета, которая называется ColorTableв статье.

По умолчанию выбран первый цвет — черный.

Вы можете изменить цвета в ссылке, используя Get-Link.ps1скрипт PowerShell, который вы уже нашли, без необходимости его понимать.

Чтобы изменить черный цвет на другой, код может выглядеть следующим образом, на основе архивного соляризационного кода сценарий:

[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.

Вы можете попробовать установить параметры реестра в 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

Связанный контент