【问题标题】:Pin program to taskbar using PS in Windows 10在 Windows 10 中使用 PS 将程序固定到任务栏
【发布时间】:2015-10-21 14:57:22
【问题描述】:

我正在尝试使用此代码将程序固定到 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 中是否有一种将程序固定到任务栏的新方法?

【问题讨论】:

  • 也许是 microsoft connect 的一个案例?好像动词不见了!但似乎存在注册表中的查找!
  • @CB。好主意。以下是报告:connect.microsoft.com/PowerShell/feedbackdetail/view/1609288/… 虽然,我觉得阻止程序“污染”任务栏可能是故意的?
  • 是的,可以,但无论如何Msft必须开始记录这种变化! Ï将投票连接
  • Eww...如果在我们在组织中迁移到 win10 时仍未解决此问题,我将更改一些登录脚本。
  • 您使用小写 N 调用 ParseName,因为它是 COM 对象而不是 powershell 方法,它可能会有所不同。如果我右键单击一个文件夹,我会看到“固定到开始”,但没有看到“固定到任务栏”

标签: powershell windows-10


【解决方案1】:

非常好!我对那个 powershell 示例做了一些小调整,希望你不介意:)

param (
    [parameter(Mandatory=$True, HelpMessage="Target item to pin")]
    [ValidateNotNullOrEmpty()]
    [string] $Target
)
if (!(Test-Path $Target)) {
    Write-Warning "$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)
}

【讨论】:

  • 首先,这太棒了!我有一段时间没有再查看这个帖子了,所以我很高兴看到一个 PS 解决方案。 @Skatterbrainz(或任何人),我对两个细节很好奇。 1:最后有一个测试,看看删除verb key后shell key是否有内容。但是这两个键都是较早创建的。为什么要进行测试而不是仅在带有 -recurse 的 shell 键上使用 Remove-Item?
  • 2:如果我使用此代码并且快捷方式已被固定,它将被取消固定。我有点希望它不会受到影响,即动词 PinToTaskbar 的最终结果是当前状态,所以不需要做任何事情。
  • 好的,关于#2,我搜索了在 HKLM 中找到的 GUID,在 HKCR 中有一个引用,其中带有 ImplementsVerbs=taskbarpin;taskbarunpin,这样就解释了切换行为。
  • 但它提出了另一个问题。 GUID 是一成不变的,还是随着 Win10 的不同版本、不同的语言等而不同?如果它总是一样,那不能只是硬编码而不是先在 HKLM 中找到它吗?
  • Windows 10 专业版 20H2,这不起作用。我没有收到错误。我根本没有注意到任何变化。我想知道我是否只是以未知的方式编辑了我的注册表。
【解决方案2】:

这是移植到 PowerShell 的 Humberto 的 vbscript 解决方案:

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

【讨论】:

  • 您好,我正在尝试将您的 powershell 代码放入函数中,但我无法让它工作:
  • @WubiUbuntu980Unity7Refugee 有一些杂散的反引号需要删除。我会尝试编辑评论以修复它们。
【解决方案3】:

在 Windows 10 中,Microsoft 在显示动词之前添加了一个简单的检查。可执行文件的名称必须是 explorer.exe。它可以在任何文件夹中,只需检查名称即可。因此,在 C# 或任何已编译的程序中,最简单的方法就是重命名您的程序。

如果这不可能,您可以欺骗 shell 对象,认为您的程序称为 explorer.exe。我写了一篇帖子here,介绍了如何在 C# 中通过更改 PEB 中的图像路径来实现。

【讨论】:

  • Alex,您是否有机会在 PowerShell 中实现此功能?我目前正在苦苦挣扎,有时最好的答案就是与得到它的人一起工作。
  • 我不是PS高手,但是不能下载链接里的C#代码,编译然后从PS调用吗?
  • 我可以走编译路线,但我一直在努力使我的代码保持可见,并希望具有教育意义。但是在 PowerShell 中内联 C# 似乎有点危险,所以我们将看看它是如何进行的。谢谢!
  • 您的项目有任何类型的许可证吗?
  • @HumbertoFreitas MIT 许可证
【解决方案4】:

我有同样的问题,我仍然不知道如何处理它,但是这个小命令行工具可以:

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

你可以像这样在命令行中使用它:

syspin "path/file.exe" c:5386

将程序固定到任务栏和

syspin "path/file.exe" c:5387

取消固定它。这对我来说很好。

【讨论】:

  • 鉴于 Technosys EXE 的存在,似乎有一种方法可以在 powerShell 中使用一些内联的 C#。就我而言,我有一个“商业”需求,因为我正在管理一个会议实验室,我们将会话软件的快捷方式放在任务栏上,使用 PowerShell 在会话之间刷新。如果需要,希望获得许可。有什么建议吗?
  • FWIW,获得许可的愿望源于 Technosys EXE 没有被签名的代码,我宁愿为签名的代码付费,也不愿让人们信任未签名的代码。
  • 凹凸。有人在 C# 中找到了一种方法吗? Technosys 需要 2000 美元来许可这个微小的功能,这似乎有些过分。
  • 是的。除了 Technosys 之外,没有人设法将应用固定到 Windows 10 任务栏。
  • 检查此链接(第一个解决方案不好但有效):connect.microsoft.com/PowerShell/feedback/details/1609288/…
【解决方案5】:

抱歉让这么老的东西复活了。

我不知道如何在 powershell 中执行此操作,但在 vbscript 中您可以执行我开发的此方法。无论系统语言如何,它都能正常工作。

适用于 Windows 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"

【讨论】:

  • 我已经在 Win 10 和 1903 上尝试了所有这些建议(ps1、vbs),但都没有奏效。有人有这方面的更新吗?
  • 显然 MS 通过这种方式停用了 pin。我有另一个使用此解决方案方法的脚本,它仍然有效,因此她似乎将此引脚形状视为安全漏洞。此解决方案仍然有效:stackoverflow.com/a/34182076/3732138
【解决方案6】:

请参阅我为目标调整的@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
'----------------------------------------------------------------------

编辑:2020 年 12 月 24 日

参考: Where is Microsoft Edge located in Windows 10? How do I launch it?

Microsoft Edge 应该在任务栏中。它是蓝色的“e”图标。

如果您没有它或已取消固定它,您只需重新固定它。不幸的是,MicrosoftEdge.exe 无法通过双击运行,创建普通快捷方式也不起作用。你可能在这个位置找到了它。

您只需在开始菜单或搜索栏中搜索 Edge。看到 Microsoft Edge 后,右键单击它并固定到任务栏


您可以使用此 vbscript 运行 Microsoft Edge:Run-Micro-Edge.vbs

CreateObject("wscript.shell").Run "%windir%\explorer.exe shell:Appsfolder\Microsoft.MicrosoftEdge_8wekyb3d8bbwe!MicrosoftEdge"

【讨论】:

    【解决方案7】:

    我使用上述答案作为动机编写了一个 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
        }
    
    }
    

    【讨论】:

    • 这是否也会从任务栏和 Windows 10 20H2 版本中取消固定?我无法从 Windows 10 20H2 以编程方式取消固定所有答案以及我尝试过的其他帖子。好奇您是否对此有所了解,并且如果您有任何确认可以使用 PS 以编程方式从任务栏取消固定,或者我可以从 PS 运行的任何东西,包括 C# 代码。认为如果没有其他问题,值得向您询问。根据我收集(和测试)的信息,微软改变了一些东西,所以你不能再通过人们写的方法来取消固定。
    • 看起来很酷,但在 win10 pro 20H2 上对我不起作用..
    【解决方案8】:

    我建议使用this Windows 10 feature。它允许人们通过 XML 文件指定固定的程序(和其他东西)。

    【讨论】:

    猜你喜欢
    • 2020-05-03
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 2012-03-09
    • 1970-01-01
    • 2010-11-30
    相关资源
    最近更新 更多