web-dev-qa-db-ja.com

Windows 10でPSを使用してプログラムをタスクバーに固定する

このコードを使用して、プログラムを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
_

ご覧のとおり、タスクバーに固定する動詞はありません。ただし、その特定のファイルを右クリックすると、オプションがあります。
Available verbs in UI

質問:
何か不足していますか?
Windows 10でプログラムをタスクバーに固定する新しい方法はありますか?

35
Daniel Hilgarth

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

非常に素晴らしい!私はその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)
}
6
Skatterbrainz

とても古いものを復活させてすみません。

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"
5

Windows 10では、Microsoftは動詞を表示する前に簡単なチェックを追加しました。実行可能ファイルの名前はExplorer.exeでなければなりません。任意のフォルダに入れることができ、名前だけがチェックされます。したがって、C#またはコンパイル済みプログラムで簡単に実行するには、プログラムの名前を変更するだけです。

それが不可能な場合、Shellオブジェクトをだまして、プログラムがExplorer.exeと呼ばれると考えることができます。 PEBのImage Pathを変更することでC#でそれを行う方法についての投稿 here を書きました。

5
AlexDev

私は同じ問題を抱えており、まだそれを処理する方法を知りませんが、この小さなコマンドラインツールは:

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

次のようなコマンドラインで使用できます。

syspin "path/file.exe" c:5386

プログラムをタスクバーに固定し、

syspin "path/file.exe" c:5387

固定を解除します。これは私には問題ありません。

3
deru