Jak utworzyć skrót za pomocą PowerShell

90

Chcę utworzyć skrót za pomocą PowerShell dla tego pliku wykonywalnego:

C:\Program Files (x86)\ColorPix\ColorPix.exe

Jak to zrobić?

cethint
źródło
2
Jeśli chcesz uruchomić skrót jako administrator, możesz użyć tej odpowiedzi .
JPBlanc
Powinieneś poważnie rozważyć przyjęcie odpowiedzi @ JPBlanc. To jeden liniowiec
Kolob Canyon
@KolobCanyon. Uważaj, moja odpowiedź to symboliczne łącze, a nie skrót.
JPBlanc

Odpowiedzi:

139

Nie znam żadnego natywnego polecenia cmdlet w PowerShell, ale zamiast tego możesz użyć obiektu com:

$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut("$Home\Desktop\ColorPix.lnk")
$Shortcut.TargetPath = "C:\Program Files (x86)\ColorPix\ColorPix.exe"
$Shortcut.Save()

możesz utworzyć skrypt PowerShell, zapisując go jako set-shortcut.ps1 w swoim $ pwd

param ( [string]$SourceExe, [string]$DestinationPath )

$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut($DestinationPath)
$Shortcut.TargetPath = $SourceExe
$Shortcut.Save()

i nazwij to tak

Set-ShortCut "C:\Program Files (x86)\ColorPix\ColorPix.exe" "$Home\Desktop\ColorPix.lnk"

Jeśli chcesz przekazać argumenty do docelowego exe, możesz to zrobić:

#Set the additional parameters for the shortcut  
$Shortcut.Arguments = "/argument=value"  

przed $ Shortcut.Save ().

Dla wygody przedstawiamy zmodyfikowaną wersję pliku set-shortcut.ps1. Przyjmuje argumenty jako drugi parametr.

param ( [string]$SourceExe, [string]$ArgumentsToSourceExe, [string]$DestinationPath )
$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut($DestinationPath)
$Shortcut.TargetPath = $SourceExe
$Shortcut.Arguments = $ArgumentsToSourceExe
$Shortcut.Save()
CB.
źródło
1
Bardzo drobne, ale tylko ze względu na spójność chciałbym, aby składnia polecenia Set-ShortCutcmdlet była bardziej podobna MKLINKlub Set-Aliasgdzie alias lub link występuje jako pierwszy argument, a następnie cel. param ( [string]$LinkPath, [string]$TargetPath )
orad
Jednym z ograniczeń składnika WshShell COM lub cmd /c mklinkobejść jest bardzo ograniczony zestaw znaków do nazwania pliku .lnk. Na przykład nazwa zawierająca → nie powiedzie się. Jednym ze sposobów obejścia tego problemu , jeśli potrzebujesz lepszej obsługi znaków, jest [Web.HttpUtility]::UrlEncode()(po Add-Type -AN System.Web) nazwie pliku podczas tworzenia pliku .lnk, a następnie zmiana nazwy na nazwę UrlDecoded za pomocą opcji Rename-Item.
brianary
Podczas tworzenia skrótu na prawdziwym pulpicie (w przeciwieństwie do zakładania zakodowanej ścieżki, która może, ale nie musi być prawdą, błąd w sztuce, który obserwowałem wiele razy), SpecialFoldersmetoda obiektu WScript może się przydać: $WshShell.SpecialFolders("Desktop")da ci prawdziwą ścieżkę do folder na pulpicie, z którego możesz później korzystać podczas dzwonienia CreateShortcut.
amn
Użyłem tej metody z PS C:\Users\${myUser} $Shortcut = $WshShell.CreateShortcut("$C:\Users\${myUser}\home.lnk"). Stworzył skrót, który można zobaczyć z eksploratora Windows, ale kiedy wpisuję cd homesam PS , pojawia się błądcd : Cannot find path 'C:\Users\carpb\home' because it does not exist.
Ben Carp
44

Począwszy PowerShell 5.0 New-Item, Remove-Itemi Get-ChildItemzostały wzmocnione w celu wspierania tworzenia i zarządzania dowiązania symboliczne. ItemType parametr New-Itemprzyjmuje nową wartość, SymbolicLink. Teraz można tworzyć łącza symboliczne w jednym wierszu, uruchamiając polecenie cmdlet New-Item.

New-Item -ItemType SymbolicLink -Path "C:\temp" -Name "calc.lnk" -Value "c:\windows\system32\calc.exe"

Zachowaj ostrożność, a SymbolicLink różni się od skrótu , skróty to tylko plik. Mają rozmiar (mały, który odwołuje się tylko do miejsca, w którym wskazują) i wymagają aplikacji obsługującej ten typ pliku, aby mogły być używane. Dowiązanie symboliczne jest na poziomie systemu plików i wszystko widzi je jako oryginalny plik. Aplikacja nie wymaga specjalnego wsparcia, aby używać dowiązania symbolicznego.

W każdym razie, jeśli chcesz utworzyć skrót Uruchom jako administrator za pomocą Powershell, możesz użyć

$file="c:\temp\calc.lnk"
$bytes = [System.IO.File]::ReadAllBytes($file)
$bytes[0x15] = $bytes[0x15] -bor 0x20 #set byte 21 (0x15) bit 6 (0x20) ON (Use –bor to set RunAsAdministrator option and –bxor to unset)
[System.IO.File]::WriteAllBytes($file, $bytes)

Jeśli ktoś chce zmienić coś innego w pliku .LNK, może skorzystać z oficjalnej dokumentacji Microsoft .

JPBlanc
źródło
4
Czy można również ustawić ikonę dla skrótu?
orad
7
Jednak łącze symboliczne bardzo różni się od skrótu. Dowiązanie symboliczne utworzone za pomocą programu New-Itemw "${env:AppData}\Microsoft\Windows\SendTo"nie będzie wyświetlane w menu Eksploratora Wyślij do, np. I nie pozwala na dostosowywanie właściwości skrótu, takich jak ikona lub katalog roboczy.
brianary
Jeśli dobrze rozumiem, jeśli ustawisz dowiązanie symboliczne, ze skrótu można korzystać z dowolnej powłoki iz dowolnego katalogu. To trochę jak ustawienie zmiennej systemowej. Czy to jest poprawne? Czy możesz go również używać do katalogów?
Ben Carp,
1
To zaskakujące, jak PowerShell Dev raczej mieć Napiszmy wykrzywioną i kod niezrozumiały jak pokazano powyżej, a nie tylko wdrożenie 3 linie do nowego parametru tak: New-Item -ItemType SymbolicLink -RunAsAdmin ....
not2qubit
1
@Luke, ale oczywiście jest to link do eksploratora, więc po dwukrotnym kliknięciu uruchamia calc.exe. Dzieje się tak, gdy uruchamiasz go za pomocą PowerShell ( & C:\temp\calc.lnk). Czego oczekujesz ?
JPBlanc