2017-08-14 65 views
8

W jaki sposób przypiąć, aby uruchomić specjalne foldery przy użyciu programu Power Shell? Tak jak "ThisPC", iexplorerJak przypiąć, aby uruchomić specjalne foldery bez docelowego identyfikatora

Spowoduje to uruchomienie exe, ale co z programem Windows explorer i myComputer? Jak przypiąć te przedmioty, ponieważ nie mają celu?

Biorąc pod uwagę to

<start:DesktopApplicationTile Size="2x2" Column="0" Row="0" DesktopApplicationLinkPath="%APPDATA%\Microsoft\Windows\Start Menu\Programs\Windows System\This PC.lnk" /> 

To wydaje się mieć problemy z .lnk dla "Ten komputer", "File Explorer", itd

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" 

próbowałem tej metody, jak również jeszcze nie przypinanie ten_komputer Aby uruchomić

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

Przeczytałem raz, że te foldery specjalne są dostępne za pośrednictwem identyfikatorów GUID: zobacz https://msdn.microsoft.com/en-us/library/windows/desktop/dd378457(v=vs.85).aspx –

+0

* "Spowoduje to rozpocznij exe w porządku "* ... co jest dokładnie tym, czym są" Mój komputer "(explorer) i Internet Explorer (iexplore.exe). Co __exactly__, próbujesz to zrobić, nie działa? – gravity

+0

@ Grawitacja, jeśli dostaję SomePath \ ThisPC.lnk. Jak znaleźć cel na tej ścieżce, aby nadać powyższą funkcję? – nlstack01

Odpowiedz

6

Większość folderów specjalnych jest dostępna przy użyciu specjalnych wartości, udokumentowanych tutaj: ShellSpecialFolderConstants enumeration

Tak więc, jeśli chcesz uzyskać Mój komputer (a.k.a. „Ten komputer”) folderu, można to zrobić:

$shell = new-object -com Shell.Application 
$folder = $shell.NameSpace(17) # "ssfDRIVES" constant 

I to będzie Ci Folder obiekt.

Istnieje inny sposób użycia folderu CLSID (a guid). Pozwoli ci to dostać się do dowolnego folderu w tak zwanym obszarze nazw powłoki, nawet tych, które mogą nie być zdefiniowane w powyższym wyliczeniu (na przykład rozszerzenia obszaru nazw w powłoce zewnętrznej). Składnia jest następująca:

$shell = new-object -com Shell.Application 
$folder = $shell.Namespace("shell:::{CLSID}") 

W rzeczywistości, to śmieszne składnia łączy 'shell:' URI moniker z shell namespace parsing syntax :: {CLSID}.

Tak na przykład dostać folder Mój komputer, byś użyć stałej znanej jako CLSID_MyComputer tak:

$shell = new-object -com Shell.Application 
$folder = $shell.Namespace("shell:::{20D04FE0-3AEA-1069-A2D8-08002B30309D}") 

Będzie to również działa:

$shell = new-object -com Shell.Application 
$folder = $shell.Namespace("shell:MyComputerFolder") # direct shell: syntax 

A powinno doprowadzić cię z powrotem ten sam obiekt, co w poprzednim wywołaniu. Wszystkie są równoważne.

Po utworzeniu obiektu Folder istnieje ostatnia podpowiedź, aby uzyskać powiązane czasowniki, ponieważ metoda Czasowniki() jest zdefiniowana tylko dla obiektu FolderItem. Aby uzyskać FolderItem z folderu (jako folder jest także „element” w przestrzeni nazw, więc ma też fasadę FolderItem), można użyć właściwości Self coś takiego:

$shell = new-object -com Shell.Application 
$folder = $shell.NameSpace("shell:::{20D04FE0-3AEA-1069-A2D8-08002B30309D}") # ssfDRIVES 
$folder.Self.Verbs() 

OK to było uzyskanie czasowników dla elementu FolderItem. Aby przypiąć element do uruchomienia, wywołanie czasownika "Przypnij do początku" nie zawsze działa (na przykład Mój komputer) lub czasownik nie jest nawet dostępny (na przykład dla standardowego folderu). Ogólnie z jakiegoś powodu nie działa tak dobrze w przypadku folderów.

Jednym z rozwiązań dla folderów jest najpierw utworzenie pliku skrótu (.lnk) gdzieś w tym folderze (w tym Mój komputer lub inne specjalne lokalizacje) i przypięcie tego pliku skrótu do uruchomienia.Uwaga: Standardowy (niejęzyk lokalny) czasownik od Pin to Start to "PinToStartScreen", lepiej go użyć niż do skanowania różnych czasowników (wszystkie czasowniki mają nazwę kanoniczną). Więc kod wyglądałby następująco przypiąć Mój komputer, aby rozpocząć:

$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 

Faktem jest, że jest dokładnie to, co robi w systemie Windows, gdy robimy „Przypnij do menu Start” na Mój komputer, tworzy skrót w C:\Users\<my user>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs

+0

dzięki za odpowiedź. Zaktualizowałem post. Znajdowanie czasownika działa dobrze, ale przypinanie nie odbywa się za pomocą .DoIt(). Nic się nie dzieje – nlstack01

+0

@ nlstack01 - Rzeczywiście. Zaktualizowałem swoją odpowiedź –

+0

Niestety nadal nie mogę uzyskać tego do Pin. Tworzy skrót grzywny, ale nie ma przypinania. Próbowałem utworzyć skrót w C: \ Users \ \ AppData \ Roaming \ Microsoft \ Windows \ Menu Start \ Programy, a także – nlstack01