bestsource

Windows 10에서 PS를 사용하여 작업 표시줄에 프로그램 고정

bestsource 2023. 8. 27. 09:44
반응형

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');

이 작업은 윈도우즈 8.1에서 작동했지만 윈도우즈 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에서 프로그램을 작업 표시줄에 고정하는 새로운 방법이 있습니까?

아주 좋아요!저는 그 파워셸의 예를 몇 가지 작은 수정을 했습니다, 당신이 개의치 않기를 바랍니다:)

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

저도 같은 문제가 있고 어떻게 처리해야 할지 아직 잘 모르지만, 이 작은 명령줄 도구는 다음과 같은 작업을 수행합니다.

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

명령행에서 다음과 같이 사용할 수 있습니다.

syspin "path/file.exe" c:5386

작업 표시줄에 프로그램을 고정하고

syspin "path/file.exe" c:5387

핀을 뽑습니다.이것은 저에게 잘 맞습니다.

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

윈도우 10에서 마이크로소프트는 동사를 보여주기 전에 간단한 검사를 추가했습니다.실행 파일의 이름은 explor.exe여야 합니다.이름만 확인하면 모든 폴더에 있을 수 있습니다.따라서 C# 또는 컴파일된 프로그램에서 쉬운 방법은 프로그램 이름을 바꾸는 것입니다.

만약 그것이 불가능하다면, 당신은 당신의 프로그램이 explor.exe라고 생각하도록 셸 객체를 속일 수 있습니다.저는 여기에 PEB에서 이미지 경로를 변경하여 C#으로 하는 방법에 대한 게시물을 작성했습니다.

오래된 것을 부활시켜서 미안합니다.

파워셸에서는 어떻게 하는지 모르겠지만 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"

경고:이 페이지의 PowerShell/VBScript 답변은 Windows 1021H2 또는 Windows 11에서 작동하지 않습니다(이 기능은 2019년까지 중단되었습니다).

사람들이 여기서 시간을 낭비하지 않도록 이것을 굵은 글씨로 표현하기만 하면 됩니다.누군가가 위의 내용을 업데이트할 수 있기를 바랍니다(훌륭한 답변이었지만 Microsoft가 변경을 가했기 때문에 더 이상 작업하지 마십시오. 따라서 여기서 답변을 조정하면 다시 작업할 수 있기를 바랍니다).현재 PowerShell을 사용하여 작업 표시줄에 앱을 고정하는 알려진 방법이 없기 때문에(이 페이지의 솔루션이 작동하지 않기 때문에) 작동하는 유일한 솔루션은syspin.exe수 . »를 사용하는 것보다 . PowerShell 답변을 업데이트할 수 있습니까? 사용하는 것보다 훨씬 더 나을 것입니다.syspin현재 (그리고 슬프게도) 이 페이지는 대부분 "꿀 덫"의 역할을 합니다; 사람들은 이것에 대한 답을 찾는 것을 기뻐하며 여기에 옵니다, 하지만 모두 고장난 해결책을 시도하느라 시간을 낭비합니다.

내 목표에 맞게 수정된 @Humberto Freitas 답변을 참조하십시오. Windows 10에서 Vbscript를 사용하여 작업 표시줄에 프로그램을 고정하려면 이 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일

참조: Microsoft Edge는 Windows 10에서 어디에 위치합니까? 어떻게 시작하죠?

Microsoft Edge가 작업 표시줄에 있어야 합니다.그것은 파란색 'e' 아이콘입니다.

Taskbar

만약 당신이 그것을 가지고 있지 않거나 핀을 제거했다면, 당신은 그것을 다시 다듬기만 하면 됩니다.도 불하게그도행그▁unfortun도.MicrosoftEdge.exe를 두 번 클릭하여 실행할 수 없으며 일반 바로 가기를 만들 수 없습니다.당신은 이 장소에서 그것을 발견했을 것입니다.

Location

시작 메뉴나 검색 표시줄에서 Edge를 검색하면 됩니다.Microsoft Edge가 나타나면 마우스 오른쪽 단추로 클릭하고 작업 표시줄에 고정합니다.

Search


Microsoft Edge는 Run-Micro-Edge.vbs 스크립트를 사용하여 실행할 수 있습니다.

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

저는 위의 답변을 동기부여 삼아 파워셸 수업을 작성했습니다.그냥 모듈에 넣은 다음 다른 스크립트로 가져왔습니다.

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 기능을 사용하는 것이 좋습니다.XML 파일을 통해 고정된 프로그램(및 기타 항목)을 지정할 수 있습니다.

언급URL : https://stackoverflow.com/questions/31720595/pin-program-to-taskbar-using-ps-in-windows-10

반응형