web-dev-qa-db-de.com

Programm mit PS in Windows 10 an Taskleiste anheften

Ich versuche, ein Programm mit dem folgenden Code an die Taskleiste in Windows 10 (RTM) anzuheften:

$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');

Dies funktionierte unter Windows 8.1, jedoch nicht mehr unter Windows 10.

Wenn ich $item.Verbs() ausführe, erhalte ich diese:

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

                   Restore previous &versions

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

Wie Sie sehen, gibt es kein Verb, um es in der Taskleiste zu fixieren. Wenn ich jedoch mit der rechten Maustaste auf diese bestimmte Datei klicke, ist die Option vorhanden:
Available verbs in UI

Fragen:
Vermisse ich etwas?
Gibt es in Windows 10 eine neue Möglichkeit, ein Programm an die Taskleiste anzuheften?

35
Daniel Hilgarth

Hier ist die auf PowerShell portierte vbscript-Lösung von Humberto:

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

Sehr schön! Ich habe ein paar kleine Verbesserungen an diesem PowerShell-Beispiel vorgenommen, ich hoffe, es macht dir nichts aus :)

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

Tut mir leid, etwas so Altes wiederzubeleben.

Ich weiß nicht, wie man das in Powershell macht, aber in VBScript kann man diese von mir entwickelte Methode machen. Es funktioniert unabhängig von der Systemsprache.

Funktioniert unter Windows 8.x und 10.

Skript

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
'----------------------------------------------------------------------

Befehlszeile:

pin and unpin: taskbarpin.vbs [fullpath]

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

In Windows 10 hat Microsoft eine einfache Prüfung hinzugefügt, bevor das Verb angezeigt wird. Der Name der ausführbaren Datei muss Explorer.exe sein. Es kann sich in jedem Ordner befinden, nur der Name wird geprüft. Der einfachste Weg in C # oder einem kompilierten Programm wäre also, Ihr Programm umzubenennen.

Wenn dies nicht möglich ist, können Sie das Shell-Objekt täuschen und glauben, Ihr Programm heißt Explorer.exe. Ich schrieb einen Beitrag hier darüber, wie dies in C # durch Ändern des Bildpfads in der PEB geschehen soll.

5
AlexDev

Ich habe das gleiche Problem und weiß immer noch nicht, wie ich damit umgehen soll, aber dieses kleine Kommandozeilen-Tool macht Folgendes:

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

Sie können es folgendermaßen in der Befehlszeile verwenden:

syspin "path/file.exe" c:5386

ein Programm an die Taskleiste anheften und

syspin "path/file.exe" c:5387

um es zu lösen. Das funktioniert gut für mich.

3
deru