我正在尝试使用以下代码将程序固定到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中是否有新方法将程序固定到任务栏?
答案 0 :(得分:5)
此处将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)
}
答案 1 :(得分:4)
在Windows 10中,Microsoft在显示动词之前添加了一个简单的检查。可执行文件的名称必须是explorer.exe。它可以在任何文件夹中,只需检查名称。因此,C#或任何已编译程序的简单方法就是重命名程序。
如果那是不可能的,你可以欺骗shell对象,以为你的程序被称为explorer.exe。我通过更改PEB中的图像路径,写了一篇关于如何在C#中完成它的帖子here。
答案 2 :(得分:4)
抱歉复活了这么久的东西。
我不知道如何在powershell中执行此操作,但在vbscript中,您可以执行我开发的此方法。无论系统语言如何,它都能正常工作。
适用于Windows 8.x和10.
<强>脚本强>
pin and unpin: taskbarpin.vbs [fullpath]
Example: taskbarpin.vbs "C:\Windows\notepad.exe"
命令行:
{{1}}
答案 3 :(得分:4)
非常好!我对powershell示例做了一些小调整,我希望你不要介意:)。
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)
}
答案 4 :(得分:3)
我有同样的问题,我仍然不知道如何处理它,但这个小命令行工具确实:
http://www.technosys.net/products/utils/pintotaskbar
您可以在命令行中使用它:
syspin "path/file.exe" c:5386
将程序固定到任务栏并
syspin "path/file.exe" c:5387
取消固定。这对我来说很好。
答案 5 :(得分:1)
请参阅我针对我调整的@Humberto Freitas答案,您可以尝试使用此vbscript,以便在Windows 10中使用Vbscript将程序固定到任务栏。
Vbscript:TaskBarPin.vbs
Option Explicit
REM Question Asked here ==>
REM https://stackoverflow.com/questions/31720595/pin-program-to-taskbar-using-ps-in-windows-10/34182076#34182076
Dim Title,objFSO,ws,objFile,sKey1,sKey2,KeyValue
Title = "Pin a program to taskbar using Vbscript in Windows 10"
'----------------------------------------------------------------------
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set Ws = CreateObject("WScript.Shell")
objFile = DeQuote(InputBox("Type the whole path of the program to be pinned or unpinned !",Title,_
"%ProgramFiles%\windows nt\accessories\wordpad.exe"))
REM Examples
REM "%ProgramFiles%\Mozilla Firefox\firefox.exe"
REM "%ProgramFiles%\Google\Chrome\Application\chrome.exe"
REM "%ProgramFiles%\windows nt\accessories\wordpad.exe"
REM "%Windir%\Notepad.exe"
ObjFile = ws.ExpandEnvironmentStrings(ObjFile)
If ObjFile = "" Then Wscript.Quit()
sKey1 = "HKCU\Software\Classes\*\shell\{:}\\"
sKey2 = Replace(sKey1, "\\", "\ExplorerCommandHandler")
'----------------------------------------------------------------------
With CreateObject("WScript.Shell")
KeyValue = .RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer" & _
"\CommandStore\shell\Windows.taskbarpin\ExplorerCommandHandler")
.RegWrite sKey2, KeyValue, "REG_SZ"
With 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
'----------------------------------------------------------------------
Function DeQuote(S)
If Left(S,1) = """" And Right(S, 1) = """" Then
DeQuote = Trim(Mid(S, 2, Len(S) - 2))
Else
DeQuote = Trim(S)
End If
End Function
'----------------------------------------------------------------------
答案 6 :(得分:0)
我使用以上答案作为动力写了一个Powershell类。我只是将其放入模块中,然后导入其他脚本中。
using module "C:\Users\dlambert\Desktop\Devin PC Setup\PinToTaskbar.psm1"
[PinToTaskBar_Verb] $pin = [PinToTaskBar_Verb]::new();
$pin.Pin("C:\Windows\explorer.exe")
$pin.Pin("$env:windir\system32\SnippingTool.exe")
$pin.Pin("C:\Windows\explorer.exe")
$pin.Pin("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe")
$pin.Pin("C:\Program Files\Notepad++\notepad++.exe")
$pin.Pin("$env:windir\system32\WindowsPowerShell\v1.0\PowerShell_ISE.exe")
下面的模块
class PinToTaskBar_Verb
{
[string]$KeyPath1 = "HKCU:\SOFTWARE\Classes"
[string]$KeyPath2 = "*"
[string]$KeyPath3 = "shell"
[string]$KeyPath4 = "{:}"
[Microsoft.Win32.RegistryKey]$Key2
[Microsoft.Win32.RegistryKey]$Key3
[Microsoft.Win32.RegistryKey]$Key4
PinToTaskBar_Verb()
{
$this.Key2 = (Get-Item $this.KeyPath1).OpenSubKey($this.KeyPath2, $true)
}
[void] InvokePinVerb([string]$target)
{
Write-Host "Pinning $target to taskbar"
$Shell = New-Object -ComObject "Shell.Application"
$Folder = $Shell.Namespace((Get-Item $Target).DirectoryName)
$Item = $Folder.ParseName((Get-Item $Target).Name)
$Item.InvokeVerb("{:}")
}
[bool] CreatePinRegistryKeys()
{
$TASKBARPIN_PATH = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\Windows.taskbarpin";
$ValueName = "ExplorerCommandHandler"
$ValueData = (Get-ItemProperty $TASKBARPIN_PATH).ExplorerCommandHandler
Write-Host "Creating Registry Key: $($this.Key2.Name)\$($this.KeyPath3)"
$this.Key3 = $this.Key2.CreateSubKey($this.KeyPath3, $true)
Write-Host "Creating Registry Key: $($this.Key3.Name)\$($this.KeyPath4)"
$this.Key4 = $this.Key3.CreateSubKey($this.KeyPath4, $true)
Write-Host "Creating Registry Key: $($this.Key4.Name)\$($valueName)"
$this.Key4.SetValue($ValueName, $ValueData)
return $true
}
[bool] DeletePinRegistryKeys()
{
Write-Host "Deleting Registry Key: $($this.Key4.Name)"
$this.Key3.DeleteSubKey($this.KeyPath4)
if ($this.Key3.SubKeyCount -eq 0 -and $this.Key3.ValueCount -eq 0)
{
Write-Host "Deleting Registry Key: $($this.Key3.Name)"
$this.Key2.DeleteSubKey($this.KeyPath3)
}
return $true
}
[bool] Pin([string]$target)
{
try
{
$this.CreatePinRegistryKeys()
$this.InvokePinVerb($target)
}
finally
{
$this.DeletePinRegistryKeys()
}
return $true
}
}
答案 7 :(得分:0)
我建议使用 this Windows 10 feature。它允许人们通过 XML 文件指定固定的程序(和其他内容)。