Закрепление приложения
- Создаём ярлык в меню Пуск (если его ещё нет).
$AppName = "TcpView"
$ExePath = "C:\Tools\tcpview.exe"
$LnkPath = "$env:APPDATA\Microsoft\Windows\Start Menu\Programs\$AppName.lnk"
if (-not (Test-Path $LnkPath)) {
$shell = New-Object -ComObject WScript.Shell
$shortcut = $shell.CreateShortcut($LnkPath)
$shortcut.TargetPath = $ExePath
$shortcut.WorkingDirectory = Split-Path $ExePath
$shortcut.IconLocation = $ExePath
$shortcut.Save()
}
- Генерируем временный LayoutModification.xml с указанием только что созданного ярлыка.
$xml = @"
<?xml version="1.0" encoding="utf-8"?>
<LayoutModificationTemplate xmlns="http://schemas.microsoft.com/Start/2014/LayoutModification"
Version="1">
<CustomTaskbarLayoutCollection PinListPlacement="Replace">
<defaultlayout:TaskbarLayout xmlns:defaultlayout="http://schemas.microsoft.com/Start/2014/FullDefaultLayout">
<taskbar:TaskbarPinList xmlns:taskbar="http://schemas.microsoft.com/Start/2014/TaskbarLayout">
<taskbar:DesktopApp DesktopApplicationLinkPath="$LnkPath"/>
</taskbar:TaskbarPinList>
</defaultlayout:TaskbarLayout>
</CustomTaskbarLayoutCollection>
</LayoutModificationTemplate>
"@
$xmlPath = "$env:LOCALAPPDATA\Microsoft\Windows\Shell\LayoutModification.xml"
$xml | Out-File -FilePath $xmlPath -Encoding UTF8 -NoNewline
- Применяем макет - принудительно перезапускаем проводник, затем удаляем файл, чтобы не оставлять "жёсткую" привязку.
Remove-Item "$env:LOCALAPPDATA\Microsoft\Windows\Shell\DefaultLayouts" -Recurse -Force -ErrorAction SilentlyContinue
Stop-Process -Name explorer -Force
Start-Sleep 5
Remove-Item $xmlPath -Force -ErrorAction SilentlyContinue
После этого ярлык появится в панели задач, но пользователь может его снять без риска автоматического возврата.
UWP‑приложения
Для приложений из Microsoft Store вместо <taskbar:DesktopApp> используется <taskbar:UWA> и указывается AppUserModelID:
$AUMID = "Microsoft.WindowsTerminal_8wekyb3d8bbwe!App"
# в XML заменить строку на:
<taskbar:UWA AppUserModelID="$AUMID"/>
Получить AUMID можно так:
Get-AppxPackage -AllUsers | Where-Object {$_.Name -like "*Terminal*"} |
Select-Object -ExpandProperty PackageFamilyName
Открепление приложения
- Получить список закрепляемых элементов (работает и в Windows 11).
(New-Object -ComObject Shell.Application).Namespace('shell:::{4234d49b-0245-4df3-b780-3893943456e1}').Items() |
Select-Object -ExpandProperty Name
- Снять закрепление по имени ярлыка.
$app = "TcpView"
$items = (New-Object -ComObject Shell.Application).Namespace('shell:::{4234d49b-0245-4df3-b780-3893943456e1}').Items()
$target = $items | Where-Object {$_.Name -eq $app}
$verb = $target.Verbs() | Where-Object {$_.Name -replace '&','' -match 'Unpin from taskbar'}
if ($verb) { $verb.DoIt() }
После выполнения ярлык исчезнет из панели задач.
Кратко
| Действие | Как делаем | Что получаем |
|---|---|---|
| Закрепить Win32‑приложение | Создаём .lnk → XML → перезапуск Explorer | Ярлык в таскбаре, пользователь может снять |
| Закрепить UWP‑приложение | Получаем AUMID → XML с <taskbar:UWA> |
Тот же результат, но для Store‑приложений |
| Открепить | Список через shell:::{4234d49b-...} → команда Unpin |
Ярлык удаляется из панели задач |
Эти скрипты работают в Windows 11 25H2 и позволяют автоматизировать настройку таскбара без необходимости менять групповые политики или копировать файлы в User Pinned\TaskBar.
