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

Вызов программы на панель задач с помощью PS в Windows 10

Я пытаюсь подключить программу к панели задач в Windows 10 (RTM) с помощью этого кода:

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

Это работало на Windows 8.1, но больше не работает в Windows 10.

Если я выполняю $item.Verbs(), я получаю следующее:

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

                   Restore previous &versions

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

Как вы можете видеть, нет глагола для прикрепления его к панели задач. Если я щелкнул правой кнопкой мыши этот конкретный файл, тем не менее, есть опция:
Доступные глаголы в пользовательском интерфейсе

Вопросы:
Я что-то не хватает?
Есть ли новый способ в Windows 10 подключить программу к панели задач?

4b9b3361

Ответ 1

У меня такая же проблема, и я до сих пор не знаю, как ее обрабатывать, но этот небольшой инструмент командной строки:

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

Вы можете использовать его в командной строке следующим образом:

syspin "path/file.exe" c:5386

чтобы связать программу с панелью задач и

syspin "path/file.exe" c:5387

чтобы разблокировать его. Это отлично работает для меня.

Ответ 2

В Windows 10 Microsoft добавила простую проверку перед отображением глагола. Имя исполняемого файла должно быть explorer.exe. Он может быть в любой папке, только имя проверяется. Таким образом, простой способ в С# или любой скомпилированной программе - просто переименовать вашу программу.

Если это невозможно, вы можете обмануть объект оболочки в том, что ваша программа называется explorer.exe. Я написал сообщение здесь о том, как это сделать на С#, изменив путь изображения в PEB.

Ответ 3

Извините, что воскресил что-то такое старое.

Я не знаю, как это сделать в powershell, но в vbscript вы можете сделать этот метод, который я разработал. Он работает независимо от языка системы.

Работает над окнами 8.x и 10.

скрипт

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

Командная строка:

pin and unpin: taskbarpin.vbs [fullpath]

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

Ответ 4

Здесь решение Humberto vbscript портировано на 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)
}

Ответ 5

Очень хорошо! Я сделал несколько небольших настроек в этом примере Powersill, надеюсь, вы не против :)

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)
}