我可以使用PowerShell将一些程序固定到Win7上的任务栏。
$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()}
如何修改上述代码以将程序固定到“开始”菜单?
答案 0 :(得分:5)
另一种方式
$sa = new-object -c shell.application
$pn = $sa.namespace($env:windir).parsename('notepad.exe')
$pn.invokeverb('startpin')
或取消固定
$pn.invokeverb('startunpin')
答案 1 :(得分:3)
使用以下代码
$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()}
注意:更改位于第四行。
答案 2 :(得分:1)
请在此处查看脚本(国际):http://gallery.technet.microsoft.com/scriptcenter/b66434f1-4b3f-4a94-8dc3-e406eb30b750
如果你想在现代UI界面(Windows 8)中添加一个动作,在$ verbs,添加51201
答案 3 :(得分:0)
大多数解决方案的主要问题是它们枚举文件上的动词,搜索字符串以执行操作(“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"
答案 4 :(得分:0)
它通过PowerShell进行COM,所以你可以用几乎任何COM客户端做同样的事情。例如,这是AutoHotkey版本。
Shell := ComObjCreate("Shell.Application")
Target := Shell.Namespace(EnvGet("WinDir")).ParseName("Notepad.exe")
Target.InvokeVerb("startpin")
除了用于创建对象的函数外,VBScript或InnoSetup看起来几乎相同。
我还发现我有一个程序固定好,但由于编译器的限制,没有正确的图标和/或描述。我刚刚制作了一个小的1行WinForms应用程序,用Process.Start启动目标,然后在AppInfo.cs的Title属性的Start菜单中添加了相应的图标和我想要的名称。