Найти в Дзене
Windows 11, 10, etc

▶️ Как скриптом отображать и скрывать значки приложений в трее панели задач

Вопрос задали в чате PowerShell Rus. Но для начала нужно понять, как этим рулить вручную. ℹ️ В разделе HKCU\Control Panel\NotifyIconSettings для каждого приложения предусмотрен свой подраздел. Там в параметре ExecutablePath прописан исполняемый файл, а параметр IsPromoted задаёт отображение значка: 1 - виден, 0 - скрыт. Всё просто, но есть нюанс © Имена подразделов задаются случайной на вид последовательностью цифр, см. картинку. И они разные у каждого пользователя. Другими словами, вы заранее не знаете, как будет называться подраздел конкретного приложения. У меня получился такой скрипт: param( [Parameter(Mandatory = $true)] [string[]]$apps, [switch]$hide ) $regkeys = Get-ChildItem -Path "HKCU:\Control Panel\NotifyIconSettings" $value = [int](-not $hide) foreach ($regkey in $regkeys) { $ExecutablePath = (Get-ItemProperty -Path "$($regkey.PSPath)").ExecutablePath foreach ($app in $apps) { if ($ExecutablePath -match [regex]::escape($app)) { Set-ItemProperty -Path "$($regkey.PSPat

▶️ Как скриптом отображать и скрывать значки приложений в трее панели задач

Вопрос задали в чате PowerShell Rus. Но для начала нужно понять, как этим рулить вручную.

ℹ️ В разделе HKCU\Control Panel\NotifyIconSettings для каждого приложения предусмотрен свой подраздел. Там в параметре ExecutablePath прописан исполняемый файл, а параметр IsPromoted задаёт отображение значка: 1 - виден, 0 - скрыт.

Всё просто, но есть нюанс © Имена подразделов задаются случайной на вид последовательностью цифр, см. картинку. И они разные у каждого пользователя. Другими словами, вы заранее не знаете, как будет называться подраздел конкретного приложения.

У меня получился такой скрипт:

param(

[Parameter(Mandatory = $true)]

[string[]]$apps,

[switch]$hide

)

$regkeys = Get-ChildItem -Path "HKCU:\Control Panel\NotifyIconSettings"

$value = [int](-not $hide)

foreach ($regkey in $regkeys) {

$ExecutablePath = (Get-ItemProperty -Path "$($regkey.PSPath)").ExecutablePath

foreach ($app in $apps) {

if ($ExecutablePath -match [regex]::escape($app)) {

Set-ItemProperty -Path "$($regkey.PSPath)" -Type DWORD `

-Name "IsPromoted" -Value $value -ErrorAction SilentlyContinue

break

}

}

}

Скрипт отображает в трее приложения, чьи имена исполняемых файлов (точнее - фрагменты имён) перечислены через запятую в параметре -apps:

.\tray-apps.ps1 -apps qbit,onedrive

Чтобы наоборот скрыть указанные приложения, добавьте параметр -hide:

.\tray-apps.ps1 -apps teleg,sharex -hide

👉 Этот пост публикуется в рубрике "PowerShell vs. CMD".

В CMD пришлось бы парсить текстовый вывод команды reg query с помощью findstr. А PowerShell работает с путями в реестре нативно, так же как с файловой системой. И командлет тот же - Get-ChildItem. С его помощью получаем список подразделов реестра и проходимся по ним выражением foreach, отбирая только значения параметра реестра ExecutablePath.

Второе, вложенное foreach перебирает массив приложений, переданный скрипту в командной строке, и сопоставляет каждое с путём к исполняемому файлу в реестре. При совпадении параметру реестра IsPromoted задаётся желаемое значение.

////

Базовых знаний #PowerShell на такое должно хватать. Единственное тонкое место - это получение и изменение значений параметров реестра. Всё-таки конструкция "$($regkey.PSPath)" не самая очевидная.

В итоге получается весьма компактно: всего 20 строк, из которых 8 пустые или скобки. И надёжно: работа с объектами, нежели парсинг текста.

Для меня победитель в этом раунде противостояния #powershellvscmd очевиден ✌️