Подтвердить что ты не робот

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

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

Это отлично работает со следующей командой

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

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

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

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

Здесь удаляется script.

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
  }
}
4b9b3361

Ответ 1

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

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

.режим версии файла:

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 File Explorer {52205FD8-5DFB-447D-801A-D0B52F2E83E1}, а не CLSID библиотек {031E4825-7B94-4dc3-B131-E946B44C8DD5}.

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