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à:
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?
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)
}
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)
}
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"
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.
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.