如何固定没有目标的特殊文件夹

时间:2017-08-14 20:20:53

标签: c# windows powershell

如何使用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

1 个答案:

答案 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 monikershell 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

中创建快捷方式