Как закрепить меню «Пуск» с помощью PowerShell - PullRequest
0 голосов
/ 28 марта 2012

Я могу закрепить некоторые программы на панели задач в Win7 с помощью PowerShell.

$shell = new-object -com "Shell.Application"  
$folder = $shell.Namespace('C:\Windows')    
$item = $folder.Parsename('notepad.exe')
$verb = $item.Verbs() | ? {$_.Name -eq 'Pin to Tas&kbar'}
if ($verb) {$verb.DoIt()}

Как изменить приведенный выше код, чтобы закрепить программу в меню «Пуск»?

Ответы [ 5 ]

5 голосов
/ 22 февраля 2014

Другой способ

$sa = new-object -c shell.application
$pn = $sa.namespace($env:windir).parsename('notepad.exe')
$pn.invokeverb('startpin')

или открепить

$pn.invokeverb('startunpin')
3 голосов
/ 10 октября 2012

Используйте код ниже

$shell = new-object -com "Shell.Application"  
$folder = $shell.Namespace('C:\Windows')    
$item = $folder.Parsename('notepad.exe')
$verb = $item.Verbs() | ? {$_.Name -eq 'Pin to Start Men&u'}
if ($verb) {$verb.DoIt()}

Примечание: изменение в четвертой строке.

1 голос
/ 07 мая 2013

Смотри скрипт (международный) здесь: http://gallery.technet.microsoft.com/scriptcenter/b66434f1-4b3f-4a94-8dc3-e406eb30b750

Если вы хотите добавить действие, например «Закрепить в интерфейсе современного пользовательского интерфейса» (Windows 8), в $ verbs добавьте 51201

0 голосов
/ 04 марта 2014

Второй ответ Стивена Пенни, приведенный выше, хорошо сработал для меня.Вот еще пара трюков:

Это делает COM через PowerShell, так что вы можете сделать то же самое практически с любым COM-клиентом.Например, вот версия AutoHotkey.

Shell := ComObjCreate("Shell.Application")
Target := Shell.Namespace(EnvGet("WinDir")).ParseName("Notepad.exe")
Target.InvokeVerb("startpin")

VBScript или InnoSetup выглядели бы почти одинаково, за исключением функции, используемой для создания объекта.

Я также обнаружил, что у меня есть одна программа, которая закрепила OK, но не имелаправильный значок и / или описание из-за ограничений в компиляторе.Я только что создал небольшое однострочное приложение WinForms, которое запускает цель с Process.Start, а затем добавил соответствующий значок и нужное имя в меню «Пуск» в свойстве «Заголовок» в AppInfo.cs.

0 голосов
/ 27 февраля 2014

Основная проблема большинства решений состоит в том, что они перечисляют глаголы в файле, ищут строку для выполнения действия («Pin to Startmenu» и т. Д.) И затем выполняют его.Это не работает, если вам нужно поддерживать более 30 языков в вашей компании, за исключением того, что вы используете внешнюю функцию для поиска локализованной команды (см. Ответ из shtako-verflow ).

Ответ от Steven Penny является первым, который не зависит от языка и не требует никакого внешнего кода.Он использует глаголы, хранящиеся в реестре HKEY_CLASSES_ROOT\CLSID\{90AA3A4E-1CBA-4233-B8BB-535773D48449} и HKEY_CLASSES_ROOT\CLSID\{a2a9545d-a0c2-42b4-9708-a0b2badd77c8}

Исходя из этого, вот код, который мы сейчас используем:

function PinToTaskbar {
         param([Parameter(Mandatory=$true)][string]$FilePath)  
  ExecuteVerb $FilePath "taskbarpin" 
}

function UnpinFromTaskbar {
         param([Parameter(Mandatory=$true)][string]$FilePath)  
  ExecuteVerb $FilePath "taskbarunpin" 
}

function PinToStartmenu {
         param([Parameter(Mandatory=$true)][string]$FilePath)  
 ExecuteVerb $FilePath "startpin" 
}

function UnpinFromStartmenu {
         param([Parameter(Mandatory=$true)][string]$FilePath)  
 ExecuteVerb $FilePath "startunpin" 
}

function ExecuteVerb {  
         param(
            [Parameter(Mandatory=$true)][string]$File,
            [Parameter(Mandatory=$true)][string]$Verb
         ) 

    $path = [System.Environment]::ExpandEnvironmentVariables($File) 
    $basePath = split-path $path -parent   #retrieve only the path File=C:\Windows\notepad.exe -> C:\Windows
    $targetFile = split-path $path -leaf    #retrieve only the file File=C:\Windows\notepad.exe -> notepad.exe

    $shell = new-object -com "Shell.Application"  
    $folder = $shell.Namespace($basePath)        
    if ($folder)
    {
       $item = $folder.Parsename($targetFile) 

       if ($item)
       {
         $item.invokeverb($Verb)
         # "This method does not return a value." (http://msdn.microsoft.com/en-us/library/windows/desktop/bb787816%28v=vs.85%29.aspx)
         # Therefore we have no chance to know if this was successful...
         write-host "Method [$Verb] executed for [$path]"       
       } 
       else
       {
         write-host "Target file [$targetFile] not found, aborting" 
       }             
    }
    else 
    {      
      write-host "Folder [$basePath] not found, aborting" 
    }

}


#PinToTaskbar "%WINDIR%\notepad.exe"
#UnpinFromTaskbar "%WINDIR%\notepad.exe"

PinToStartmenu "%WINDIR%\notepad.exe"
#UnpinFromStartmenu "%WINDIR%\notepad.exe"
...