web-dev-qa-db-fra.com

Épingler un programme à la barre des tâches à l'aide de PS dans Windows 10

J'essaie d'épingler un programme dans la barre des tâches de Windows 10 (RTM) à l'aide de ce code:

$Shell = new-object -com "Shell.Application"  
$folder = $Shell.Namespace((Join-Path $env:SystemRoot System32\WindowsPowerShell\v1.0))
$item = $folder.Parsename('powershell_ise.exe')
$item.invokeverb('taskbarpin');

Cela fonctionnait sous Windows 8.1, mais ne fonctionnait plus sous Windows 10.

Si j'exécute $item.Verbs(), j'obtiens ces informations:

Application Parent Name
----------- ------ ----
                   &Open
                   Run as &administrator
                   &Pin to Start

                   Restore previous &versions

                   Cu&t
                   &Copy
                   Create &shortcut
                   &Delete
                   Rena&me
                   P&roperties

Comme vous pouvez le constater, il n’existe aucun verbe pour l’épingler dans la barre des tâches. Si je clique avec le bouton droit sur ce fichier spécifique, cependant, l'option est là:
Available verbs in UI

Questions:
Est-ce que je manque quelque chose?
Existe-t-il un nouveau moyen dans Windows 10 d’ajouter un programme à la barre des tâches?

35
Daniel Hilgarth

Voici la solution vbscript de Humberto transférée sur PowerShell:

Param($Target)

$KeyPath1  = "HKCU:\SOFTWARE\Classes"
$KeyPath2  = "*"
$KeyPath3  = "Shell"
$KeyPath4  = "{:}"
$ValueName = "ExplorerCommandHandler"
$ValueData = (Get-ItemProperty("HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\" +
  "Explorer\CommandStore\Shell\Windows.taskbarpin")).ExplorerCommandHandler

$Key2 = (Get-Item $KeyPath1).OpenSubKey($KeyPath2, $true)
$Key3 = $Key2.CreateSubKey($KeyPath3, $true)
$Key4 = $Key3.CreateSubKey($KeyPath4, $true)
$Key4.SetValue($ValueName, $ValueData)

$Shell = New-Object -ComObject "Shell.Application"
$Folder = $Shell.Namespace((Get-Item $Target).DirectoryName)
$Item = $Folder.ParseName((Get-Item $Target).Name)
$Item.InvokeVerb("{:}")

$Key3.DeleteSubKey($KeyPath4)
if ($Key3.SubKeyCount -eq 0 -and $Key3.ValueCount -eq 0) {
    $Key2.DeleteSubKey($KeyPath3)
}
6
Lukasz Mendakiewicz

Très agréable! J'ai fait quelques petites modifications à cet exemple de powershell, j'espère que cela ne vous dérange pas :)

param (
    [parameter(Mandatory=$True, HelpMessage="Target item to pin")]
    [ValidateNotNullOrEmpty()]
    [string] $Target
)
if (!(Test-Path $Target)) {
    Write-Warning "You freaking dumbass!!! $Target does not exist"
    break
}

$KeyPath1  = "HKCU:\SOFTWARE\Classes"
$KeyPath2  = "*"
$KeyPath3  = "Shell"
$KeyPath4  = "{:}"
$ValueName = "ExplorerCommandHandler"
$ValueData =
    (Get-ItemProperty `
        ("HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\" + `
            "CommandStore\Shell\Windows.taskbarpin")
    ).ExplorerCommandHandler

$Key2 = (Get-Item $KeyPath1).OpenSubKey($KeyPath2, $true)
$Key3 = $Key2.CreateSubKey($KeyPath3, $true)
$Key4 = $Key3.CreateSubKey($KeyPath4, $true)
$Key4.SetValue($ValueName, $ValueData)

$Shell = New-Object -ComObject "Shell.Application"
$Folder = $Shell.Namespace((Get-Item $Target).DirectoryName)
$Item = $Folder.ParseName((Get-Item $Target).Name)
$Item.InvokeVerb("{:}")

$Key3.DeleteSubKey($KeyPath4)
if ($Key3.SubKeyCount -eq 0 -and $Key3.ValueCount -eq 0) {
    $Key2.DeleteSubKey($KeyPath3)
}
6
Skatterbrainz

Désolé de ressusciter quelque chose d'aussi vieux.

Je ne sais pas comment faire cela dans powershell, mais dans vbscript, vous pouvez utiliser cette méthode que j'ai développée. Cela fonctionne quelle que soit la langue du système.

Fonctionne sur Windows 8.x et 10.

Script

If WScript.Arguments.Count < 1 Then WScript.Quit
'----------------------------------------------------------------------
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFile    = WScript.Arguments.Item(0)
sKey1      = "HKCU\Software\Classes\*\Shell\{:}\\"
sKey2      = Replace(sKey1, "\\", "\ExplorerCommandHandler")
'----------------------------------------------------------------------
With WScript.CreateObject("WScript.Shell")
    KeyValue = .RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer" & _
        "\CommandStore\Shell\Windows.taskbarpin\ExplorerCommandHandler")

    .RegWrite sKey2, KeyValue, "REG_SZ"

    With WScript.CreateObject("Shell.Application")
        With .Namespace(objFSO.GetParentFolderName(objFile))
            With .ParseName(objFSO.GetFileName(objFile))
                .InvokeVerb("{:}")
            End With
        End With
    End With

    .Run("Reg.exe delete """ & Replace(sKey1, "\\", "") & """ /F"), 0, True
End With
'----------------------------------------------------------------------

Ligne de commande:

pin and unpin: taskbarpin.vbs [fullpath]

Example: taskbarpin.vbs "C:\Windows\notepad.exe"
5
Humberto Freitas

Dans Windows 10, Microsoft a ajouté une simple vérification avant d'afficher le verbe. Le nom de l'exécutable doit être Explorer.exe. Il peut être dans n'importe quel dossier, seul le nom est vérifié. Ainsi, le moyen le plus simple de créer un programme compilé serait de renommer votre programme.

Si ce n'est pas possible, vous pouvez tromper l'objet Shell en pensant que votre programme s'appelle Explorer.exe. J'ai écrit un post ici sur la façon de le faire en C # en modifiant le chemin de l'image dans le PEB.

5
AlexDev

J'ai le même problème et je ne sais toujours pas comment le gérer, mais ce petit outil en ligne de commande fait:

http://www.technosys.net/products/utils/pintotaskbar

Vous pouvez l'utiliser en ligne de commande comme ça:

syspin "path/file.exe" c:5386

épingler un programme à la barre des tâches et

syspin "path/file.exe" c:5387

pour le détacher. Cela fonctionne bien pour moi.

3
deru