Используйте PowerShell, чтобы открепить ярлык на панели задач в зависимости от целевого пути ярлыка

Возникла проблема с некоторыми PowerShell. В основном я пытаюсь удалить определенные ярлыки панели задач на основе пути ярлыков/exe-файла.

Следующий код получает закрепленные ярлыки и их имена из папки AppData:

Function Get-TaskbarShortcuts
{
Begin{
  Clear-Host
        $Path = "C:\Users\username\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar"
        $x=0
      } # End of Begin

Process
    {
        $TaskbarShortcuts = Get-ChildItem $Path -Recurse -Include *.lnk
            ForEach($ShortCut in $TaskbarShortcuts)
            {
                $Shell = New-Object -ComObject WScript.Shell 
                    $Properties = @{
                    ShortcutName = $Shortcut.Name 
                    LinkTarget = $Shell.CreateShortcut($Shortcut).targetpath 
                                    }
                New-Object PSObject -Property $Properties 
                $x ++
                Write-Host $ShortCut
            } #End of ForEach
        [Runtime.InteropServices.Marshal]::ReleaseComObject($Shell) | Out-Null
    } # End of Process
  End{}
}

Мне нужно изменить этот код, чтобы удалить определенные ярлыки... скажем, например, пользователь закрепил «C:\Windows\notepad.exe», но назвал имя ярлыка как-то странно. Как удалить фактическую булавку с панели задач (а не просто удалить файл ярлыка)?


person pcoul    schedule 30.07.2014    source источник
comment
Вы не найдете официально поддерживаемого решения для этого. Microsoft намеренно затруднила программную модификацию закрепленных элементов на панели задач. В WinXP многие установщики добавляли свои собственные значки в панель быстрого запуска, а затем удаляли значки своих конкурентов. MS хотела избежать этого с панелью задач Win7.   -  person Ryan Bemrose    schedule 16.07.2015


Ответы (1)


Удаление ярлыка из "C:\Users\имя пользователя\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar" оставляет значок на панели задач, но в непригодном для использования состоянии, и при нажатии на него появляется сообщение об ошибке. не существует и спрашивает, хотите ли вы его удалить. Я предполагаю, что это то, чего вы хотите избежать.

Кажется, нет простого способа сделать это, но в Центре сценариев TechNet есть модуль, который делает свое дело:

Закрепление и открепление приложений на панели задач и в меню "Пуск"

###########################################################################" 
 #  
 # 
 # NAME: PinnedApplications.psm1 
 #  
 # AUTHOR: Jan Egil Ring, Crayon 
 # 
 # DATE  : 06.08.2010  
 #  
 # COMMENT: Module with the ability to pin and unpin programs from the taskbar and the Start-menu in Windows 7 and Windows Server 2008 R2. 
 # 
 # This module are based on the Add-PinnedApplication script created by Ragnar Harper and Kristian Svantorp: 
 # http://blogs.technet.com/kristian/archive/2009/04/24/nytt-script-pin-to-taskbar.aspx 
 # http://blog.crayon.no/blogs/ragnar/archive/2009/04/17/pin-applications-to-windows-7-taskbar.aspx 
 # 
 # Johan Akerstrom`s blog: http://cosmoskey.blogspot.com 
 # 
 # For more information, see the following blog post: 
 # http://blog.crayon.no/blogs/janegil/archive/2010/02/26/pin-and-unpin-applications-from-the-taskbar-and-start-menu-using-windows-powershell.aspx 
 # 
 # VERSION HISTORY: 
 # 1.0 17.04.2009 - Initial release by Ragnar Harper and Kristian Svantorp 
 # 1.1 26.02.2010 - Update by Jan Egil Ring. Added the capability to unpin applications. 
 # 1.2 06.08.2010 - Update by Johan Akerstrom. Added full MUI support. 
 #  
 ###########################################################################" 


function Set-PinnedApplication 
{ 
<#  
.SYNOPSIS  
This function are used to pin and unpin programs from the taskbar and Start-menu in Windows 7 and Windows Server 2008 R2 
.DESCRIPTION  
The function have to parameteres which are mandatory: 
Action: PinToTaskbar, PinToStartMenu, UnPinFromTaskbar, UnPinFromStartMenu 
FilePath: The path to the program to perform the action on 
.EXAMPLE 
Set-PinnedApplication -Action PinToTaskbar -FilePath "C:\WINDOWS\system32\notepad.exe" 
.EXAMPLE 
Set-PinnedApplication -Action UnPinFromTaskbar -FilePath "C:\WINDOWS\system32\notepad.exe" 
.EXAMPLE 
Set-PinnedApplication -Action PinToStartMenu -FilePath "C:\WINDOWS\system32\notepad.exe" 
.EXAMPLE 
Set-PinnedApplication -Action UnPinFromStartMenu -FilePath "C:\WINDOWS\system32\notepad.exe" 
#>  
       [CmdletBinding()] 
       param( 
      [Parameter(Mandatory=$true)][string]$Action,  
      [Parameter(Mandatory=$true)][string]$FilePath 
       ) 
       if(-not (test-path $FilePath)) {  
           throw "FilePath does not exist."   
    } 

       function InvokeVerb { 
           param([string]$FilePath,$verb) 
        $verb = $verb.Replace("&","") 
        $path= split-path $FilePath 
        $shell=new-object -com "Shell.Application"  
        $folder=$shell.Namespace($path)    
        $item = $folder.Parsename((split-path $FilePath -leaf)) 
        $itemVerb = $item.Verbs() | ? {$_.Name.Replace("&","") -eq $verb} 
        if($itemVerb -eq $null){ 
            throw "Verb $verb not found."             
        } else { 
            $itemVerb.DoIt() 
        } 

       } 
    function GetVerb { 
        param([int]$verbId) 
        try { 
            $t = [type]"CosmosKey.Util.MuiHelper" 
        } catch { 
            $def = [Text.StringBuilder]"" 
            [void]$def.AppendLine('[DllImport("user32.dll")]') 
            [void]$def.AppendLine('public static extern int LoadString(IntPtr h,uint id, System.Text.StringBuilder sb,int maxBuffer);') 
            [void]$def.AppendLine('[DllImport("kernel32.dll")]') 
            [void]$def.AppendLine('public static extern IntPtr LoadLibrary(string s);') 
            add-type -MemberDefinition $def.ToString() -name MuiHelper -namespace CosmosKey.Util             
        } 
        if($global:CosmosKey_Utils_MuiHelper_Shell32 -eq $null){         
            $global:CosmosKey_Utils_MuiHelper_Shell32 = [CosmosKey.Util.MuiHelper]::LoadLibrary("shell32.dll") 
        } 
        $maxVerbLength=255 
        $verbBuilder = new-object Text.StringBuilder "",$maxVerbLength 
        [void][CosmosKey.Util.MuiHelper]::LoadString($CosmosKey_Utils_MuiHelper_Shell32,$verbId,$verbBuilder,$maxVerbLength) 
        return $verbBuilder.ToString() 
    } 

    $verbs = @{  
        "PintoStartMenu"=5381 
        "UnpinfromStartMenu"=5382 
        "PintoTaskbar"=5386 
        "UnpinfromTaskbar"=5387 
    } 

    if($verbs.$Action -eq $null){ 
           Throw "Action $action not supported`nSupported actions are:`n`tPintoStartMenu`n`tUnpinfromStartMenu`n`tPintoTaskbar`n`tUnpinfromTaskbar" 
    } 
    InvokeVerb -FilePath $FilePath -Verb $(GetVerb -VerbId $verbs.$action) 
} 

Export-ModuleMember Set-PinnedApplication
person CitizenRon    schedule 30.07.2014
comment
Да, я пытался избежать ошибки, которую вы упомянули. Спасибо, попробую модуль :) - person pcoul; 31.07.2014
comment
Подтверждено, что Set-PinnedApplication -Action UnPinFromTaskbar -FilePath "C:\WINDOWS\system32\notepad.exe" удаляет блокнот с моей панели задач. - person 030; 16.07.2015
comment
Это работает для приложений UWP? Как получить путь? - person JOATMON; 12.08.2019
comment
Кто-нибудь понял, как это сделать для приложений UWP? - person Generic Name; 20.05.2020