Как открепить папку "Библиотека" от панели задач с помощью Powershell?

Я модифицирую сценарии Chocolatey, чтобы включить Uninstall-ChocolateyPinnedTaskBarItem функциональность.

Это прекрасно работает с помощью следующей команды

# WORKS
Uninstall-ChocolateyPinnedTaskBarItem "$env:ProgramFiles\Internet Explorer\iexplore.exe"

Но это не работает с

# DOESN'T WORK
Uninstall-ChocolateyPinnedTaskBarItem "$env:SystemRoot\explorer.exe"

Как избавиться от закрепленной по умолчанию папки "Библиотека", используя исключительно Powershell?

Вот сценарий удаления.

function Uninstall-ChocolateyPinnedTaskBarItem {
<#
.SYNOPSIS
Removes an item from the task bar linking to the provided path.

.PARAMETER TargetFilePath
The path to the application that should be launched when clicking on the task bar icon.

.EXAMPLE
Uninstall-ChocolateyPinnedTaskBarItem "${env:ProgramFiles(x86)}\Microsoft Visual Studio 11.0\Common7\IDE\devenv.exe"

This will remove the Visual Studio task bar icon.

#>
param(
  [string] $targetFilePath
)

  Write-Debug "Running 'Uninstall-ChocolateyPinnedTaskBarItem' with targetFilePath:`'$targetFilePath`'";

  if (test-path($targetFilePath)) {
    $verb = "Unpin from Taskbar"
    $path= split-path $targetFilePath 
    $shell=new-object -com "Shell.Application"  
    $folder=$shell.Namespace($path)    
    $item = $folder.Parsename((split-path $targetFilePath -leaf)) 
    $itemVerb = $item.Verbs() | ? {$_.Name.Replace("&","") -eq $verb} 
    if($itemVerb -eq $null){ 
      Write-Host "TaskBar verb not found for $item. It may have already been unpinned"
    } else { 
        $itemVerb.DoIt() 
    } 
    Write-Host "`'$targetFilePath`' has been unpinned from the task bar on your desktop"
  } else {
    $errorMessage = "`'$targetFilePath`' does not exist, not able to unpin from task bar"
  }
  if($errorMessage){
    Write-Error $errorMessage
    throw $errorMessage
  }
}

1 ответ

После того, как я наткнулся на похожую проблему, мой опыт заставляет меня поверить, что эта проблема возникает только в Windows 8.x, и, IMHO, это ошибка.

tl; dr: в разделе реестра [HKEY_CLASSES_ROOT\CLSID\{52205fd8-5dfb-447d-801a-d0b52f2e83e1}добавить ключи shellex\ContextMenuHandlers\{90AA3A4E-1CBA-4233-B8BB-535773D48449},

версия файла.reg:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\CLSID\{52205fd8-5dfb-447d-801a-d0b52f2e83e1}\shellex\ContextMenuHandlers\{90AA3A4E-1CBA-4233-B8BB-535773D48449}]

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: [HKEY_CLASSES_ROOT\CLSID\{52205fd8-5dfb-447d-801a-d0b52f2e83e1}] является защищенным ключом TrustedInstaller Используйте свое лучшее суждение.


Вот шаги, которые привели меня туда:

Чтобы приступить к диагностике проблемы, я написал эту функцию, которая извлекает закрепленные файлы lnk или, необязательно, цели файлов lnk:

function Get-UserPinnedItems([switch]$Target)
{
    $userPinnedPath = "$env:APPDATA\Microsoft\Internet Explorer\Quick Launch\User Pinned\Taskbar"
    $shellApp       = New-Object -ComObject 'Shell.Application'
    $items          = $shellApp.Namespace($userPinnedPath).Items() | where { $_.IsLink }

    if ($Target)
    {
        return $items | foreach { $_.GetLink.Target }
    }
    $items
}

Запустив вышеуказанное с ключом -Target в Windows 8.1, я получаю следующее:

PS> Get-UserPinnedItems -Target

Application  : System.__ComObject
Parent       : System.__ComObject
Name         : File Explorer
Path         : ::{52205FD8-5DFB-447D-801A-D0B52F2E83E1}
GetLink      : 
GetFolder    : 
IsLink       : False
IsFolder     : False
IsFileSystem : False
IsBrowsable  : False
ModifyDate   : 12/30/1899 12:00:00 AM
Size         : 0
Type         : System Folder

Обратите внимание, что путь ::{52205FD8-5DFB-447D-801A-D0B52F2E83E1}, По-видимому, это новый CLSID для File Explorer, для которого доступно очень мало информации. Поиск этого руководства в реестре (или даже в Интернете) не дает много результатов. В Windows 7 я получаю путь к файловой системе "C:\Windows\explorer.exe", поэтому я считаю, что это проблема только для Win8.

Теперь закрепление / открепление элементов на панели задач обрабатывается интерфейсом IStartMenuPinnedList, который имеет CLSID {90AA3A4E-1CBA-4233-B8BB-535773D48449}. Поиск этого гида в реестре дает несколько результатов. В большинстве случаев происходит, когда конкретный тип файла требует функции Pin/Unpin.

Итак, поскольку в File Explorer отсутствует эта функциональность, добавление ContextMenuHandler показалось хорошей идеей, и, конечно же, это сработало как обаяние, по крайней мере, для меня. YMMV. Если это не работает для других, возможно, это по крайней мере обеспечит некоторые выводы.


В сторону: OP заявляет, что проблема связана с закрепленной папкой "Библиотека". Я не думаю, что это совершенно правильно, учитывая тот факт, что закрепленный элемент имеет CLSID файлового обозревателя {52205FD8-5DFB-447D-801A-D0B52F2E83E1}, а не CLSID библиотек {031E4825-7B94-4dc3-B131-E946B44C8DD5}.

Во время бега Shell:::{031E4825-7B94-4dc3-B131-E946B44C8DD5} всегда открывает папку Libraries, работает Shell:::{52205FD8-5DFB-447D-801A-D0B52F2E83E1} может открыть папку "Библиотеки" или "Этот компьютер" в зависимости от того, включен ли для пользователя параметр "Показать библиотеки". Исходя из этого, я бы переименовал пост в "Проводник" вместо "Библиотека". Также я бы сказал, какую ОС я использовал.

Другие вопросы по тегам