在Windows 10中使用PS将程序固定到任务栏

Dan*_*rth 35 powershell 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');
Run Code Online (Sandbox Code Playgroud)

这适用于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
Run Code Online (Sandbox Code Playgroud)

如您所见,没有动词将其固定到任务栏.但是,如果我右键单击该特定文件,则选项位于:
用户界面中的可用动词

问题:
我错过了什么吗?
Windows 10中是否有新方法将程序固定到任务栏?

der*_*eru 7

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

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

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

syspin "path/file.exe" c:5386
Run Code Online (Sandbox Code Playgroud)

将程序固定到任务栏和

syspin "path/file.exe" c:5387
Run Code Online (Sandbox Code Playgroud)

解开它。这对我来说很好用。

  • 鉴于 Technosys EXE 的存在,似乎有一种方法可以使用一些内联 C# 在 powerShell 中工作。就我而言,我有一个“商业”需求,因为我正在管理一个会议实验室,我们将会话软件的快捷方式放在任务栏上,使用 PowerShell 在会话之间进行刷新。希望在需要时获得许可。有什么建议么? (3认同)

Ska*_*inz 7

非常好!我对该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)
}
Run Code Online (Sandbox Code Playgroud)

  • Windows 10 专业版 20H2 这不起作用。我没有收到错误。我根本没有注意到任何变化。我想知道我是否只是以未知的方式编辑了我的注册表。 (4认同)

Luk*_*icz 6

这是Humberto的移植到PowerShell的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)
}
Run Code Online (Sandbox Code Playgroud)


Yor*_*ubs 6

警告:本页上的 PowerShell / VBScript 答案均不适用于 Windows 10 21H2 或 Windows 11(并且此功能早在 2019 年就已被破坏)。

只是将其加粗,这样人们就不会在这里浪费时间。希望有人可以更新上面的内容(因为它们是很好的答案,但由于微软进行了更改而不再工作,所以希望对这里的答案进行一些调整可以让它们再次工作)。由于目前没有已知的方法可以使用 PowerShell 将应用程序固定到任务栏(因为此页面上的解决方案都不起作用),因此我知道唯一有效的解决方案是应用程序syspin.exe。请更新 PowerShell 答案,因为这比使用syspin. 目前(遗憾的是),此页面主要充当“美人计”;人们来到这里,很高兴找到这个问题的答案,结果却浪费了时间去尝试那些全都失效的解决方案。


Ale*_*Dev 5

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

如果那是不可能的,您可以欺骗外壳对象以使您的程序称为explorer.exe。我在这里写了一篇文章介绍如何通过更改PEB中的图像路径在C#中执行此操作。

  • 不幸的是,这个技巧在 Windows 10 1903 May 更新中不再起作用 (3认同)

Hum*_*tas 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
'----------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

命令行:

pin and unpin: taskbarpin.vbs [fullpath]

Example: taskbarpin.vbs "C:\Windows\notepad.exe"
Run Code Online (Sandbox Code Playgroud)

  • 我已经在 Win 10 vers 1903 上尝试了所有这些建议(ps1、vbs),但没有一个起作用。有人有这方面的更新吗? (2认同)