如何使用PowerShell启动特殊文件夹?喜欢" ThisPC",iexplorer
这将启动exe很好,但是Windows资源管理器和myComputer呢?如何锁定这些项目,因为它们没有目标?
鉴于此
<start:DesktopApplicationTile Size="2x2" Column="0" Row="0" DesktopApplicationLinkPath="%APPDATA%\Microsoft\Windows\Start Menu\Programs\Windows System\This PC.lnk" />
对于&#34;此PC&#34;,&#34;文件资源管理器&#34;等<。p>似乎存在问题.lnk&#34>
Function PinLnk
{
Param
(
[Parameter(Mandatory,Position=0)]
[Alias('p')]
[String[]]$Path
)
$Shell = New-Object -ComObject Shell.Application
$Desktop = $Shell.NameSpace(0X0)
$WshShell = New-Object -comObject WScript.Shell
$Flag=0
Foreach($itemPath in $Path)
{
$itemName = Split-Path -Path $itemPath -Leaf
#pin application to windows Start menu
$ItemLnk = $Desktop.ParseName($itemPath)
$ItemVerbs = $ItemLnk.Verbs()
Foreach($ItemVerb in $ItemVerbs)
{
If($ItemVerb.Name.Replace("&","") -match "Pin to Start")
{
$ItemVerb.DoIt()
$Flag=1
}
}
}
}
PinLnk "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe"
我尝试了这种方法,但仍未将计算机固定在
上PS C:\WINDOWS\system32> Function PinLnk14
>> {
>>
>> $shell = new-object -com Shell.Application
>> $folder = $shell.NameSpace("shell:::{20D04FE0-3AEA-1069-A2D8-08002B30309D}") # ssfDRIVES
>> $ItemVerbs=$folder.Self.Verbs()
>> Foreach($ItemVerb in $ItemVerbs)
>> {
>> Write-Output $ItemVerb.Name
>> If($ItemVerb.Name.Replace("&","") -match "Pin to Start")
>> {
>> Write-Output "TRYING TO PIN"
>> $ItemVerb.DoIt()
>> }
>> }
>> }
PS C:\WINDOWS\system32>
PS C:\WINDOWS\system32> Pinlnk14
&Open
Pin to Quick access
Mana&ge
&Pin to Start
TRYING TO PIN
Map &network drive...
Dis&connect network drive...
Create &shortcut
&Delete
Rena&me
P&roperties
答案 0 :(得分:7)
大多数特殊文件夹都可以使用特殊值访问,请在此处记录:ShellSpecialFolderConstants enumeration
所以,如果你想获得我的电脑(a.k.a。&#34;这个PC&#34;)文件夹,你可以这样做:
$shell = new-object -com Shell.Application
$folder = $shell.NameSpace(17) # "ssfDRIVES" constant
这会得到一个Folder对象。
还有另一种使用文件夹CLSID(guid)的方法。它将允许您访问所谓的shell命名空间中的任何文件夹,甚至是可能未在上面的枚举中定义的文件夹(例如,第三方shell命名空间扩展)。语法是这样的:
$shell = new-object -com Shell.Application
$folder = $shell.Namespace("shell:::{CLSID}")
事实上,这个有趣的语法将'shell:' URI moniker与shell namespace parsing syntax :: {CLSID}结合在一起。
例如,要获取“我的电脑”文件夹,您可以使用这样的常量CLSID_MyComputer
:
$shell = new-object -com Shell.Application
$folder = $shell.Namespace("shell:::{20D04FE0-3AEA-1069-A2D8-08002B30309D}")
这也有效:
$shell = new-object -com Shell.Application
$folder = $shell.Namespace("shell:MyComputerFolder") # direct shell: syntax
它应该会让你回到与之前通话中相同的对象。他们都是等同的。
一旦你有了一个Folder对象,就有了获取相关动词的最后一个技巧,因为Verbs()方法只在FolderItem对象上定义。 要从文件夹中获取FolderItem(作为文件夹也是&#34;项目&#34;在命名空间中,因此它还有一个FolderItem外观),您可以使用Self属性,如下所示: / p>
$shell = new-object -com Shell.Application
$folder = $shell.NameSpace("shell:::{20D04FE0-3AEA-1069-A2D8-08002B30309D}") # ssfDRIVES
$folder.Self.Verbs()
好的,就是获取FolderItem的动词。然而,要固定一个项目,然后启动&#34; Pin to Start&#34;动词调用并不总是有效(例如,对于“我的电脑”),或者动词甚至不可用(例如,对于标准文件夹)。一般来说,由于某种原因,它对文件夹的效果并不好。
因此,文件夹的一个解决方案是首先在该文件夹(包括“我的电脑”或其他特殊位置)的某处创建一个快捷方式文件(.lnk),然后将该快捷方式文件固定到该文件夹中。注意:Pin to Start的标准(非语言本地化)动词是&#34; PinToStartScreen &#34;,使用它比扫描各种动词更好(所有动词都有一个规范的名字)。因此,代码看起来像这样将我的电脑固定为:
$wshell = new-object -com WScript.Shell
$shortcut = $wshell.CreateShortcut("c:\temp\mypc.lnk")
$shortcut.TargetPath = "shell:MyComputerFolder" # use the same syntax as described above
$shortcut.Save()
$shell = new-object -com Shell.Application
$folder = $shell.NameSpace("c:\temp")
$lnk = $folder.ParseName("mypc.lnk") # get the shortcut file
$lnk.InvokeVerb("PinToStartScreen") # invoke "Pin To Start" on the shortcut file
事实上,这正是Windows在我们做的时候所做的事情&#34; Pin to Start&#34;在“我的电脑”上,它会在C:\Users\<my user>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs