Вызов программы на панель задач с помощью 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 подключить программу к панели задач?
Ответы
Ответ 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)
}