So erstellen Sie eine Verknüpfung mit PowerShell

89

Ich möchte mit PowerShell eine Verknüpfung für diese ausführbare Datei erstellen:

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

Wie kann das gemacht werden?

cethint
quelle
2
Wenn Sie als Administrator eine Verknüpfung ausführen möchten, können Sie diese Antwort verwenden .
JPBlanc
Sie sollten ernsthaft in Betracht ziehen, die Antwort von @ JPBlanc zu akzeptieren. Es ist ein Einzeiler
Kolob Canyon
@KolobCanyon Sei vorsichtig, meine Antwort ist ein symbolischer Link, keine Abkürzung.
JPBlanc

Antworten:

136

Ich kenne kein natives Cmdlet in Powershell, aber Sie können stattdessen ein com-Objekt verwenden:

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

Sie können ein Powershell-Skript erstellen, das als set-shortcut.ps1 in Ihrem $ pwd gespeichert ist

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

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

und nenne es so

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

Wenn Sie Argumente an die Ziel-Exe übergeben möchten, können Sie Folgendes tun:

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

vor $ Shortcut.Save ().

Der Einfachheit halber finden Sie hier eine modifizierte Version von set-shortcut.ps1. Es akzeptiert Argumente als zweiten Parameter.

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.
quelle
1
Sehr geringfügig, aber nur aus Gründen der Konsistenz hätte ich die Syntax von Set-ShortCutCmdlet eher so MKLINK, oder Set-Aliaswo der Alias ​​oder Link als erstes Argument und dann als Ziel kommt. param ( [string]$LinkPath, [string]$TargetPath )
Orad
Eine Einschränkung der WshShell COM-Komponente oder der Problemumgehungen cmd /c mklinkist ein sehr begrenzter Zeichensatz für die Benennung der .lnk-Datei. Ein Name mit einem → schlägt beispielsweise fehl. Eine Möglichkeit, dies zu umgehen , besteht darin, beim Erstellen der .lnk-Datei [Web.HttpUtility]::UrlEncode()(nach Add-Type -AN System.Web) dem Dateinamen (nach ) dem Dateinamen zu suchen und ihn dann mit Rename-Item in den Namen UrlDecoded umzubenennen.
Brian
Wenn Sie eine Verknüpfung auf einem echten Desktop erstellen (im Gegensatz zur Annahme eines fest codierten Pfads, der möglicherweise wahr ist oder nicht, ein Fehler, den ich oft beobachtet habe), kann die SpecialFoldersMethode eines WScript-Objekts nützlich sein: $WshShell.SpecialFolders("Desktop")Sie erhalten den wahren Pfad zu den Desktop-Ordner, den Sie später beim Aufrufen verwenden können CreateShortcut.
amn
Ich habe diese Methode mit verwendet PS C:\Users\${myUser} $Shortcut = $WshShell.CreateShortcut("$C:\Users\${myUser}\home.lnk"). Es wurde eine Verknüpfung erstellt, die im Windows Explorer angezeigt werden kann, aber als ich cd homedie PS selbst eintippte, wurde eine Fehlermeldung cd : Cannot find path 'C:\Users\carpb\home' because it does not exist.
angezeigt
43

Beginnend Powershell 5.0 New-Item, Remove-Itemund Get-ChildItemwurde erweitert , Erstellung und Verwaltung von symbolischen Links zu unterstützen. Der Parameter ItemType für New-Itemakzeptiert einen neuen Wert, SymbolicLink. Jetzt können Sie symbolische Links in einer einzelnen Zeile erstellen, indem Sie das Cmdlet New-Item ausführen.

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

Seien Sie vorsichtig, ein SymbolicLink unterscheidet sich von einer Verknüpfung . Verknüpfungen sind nur eine Datei. Sie haben eine Größe (eine kleine, die nur darauf verweist, wohin sie zeigen) und sie benötigen eine Anwendung, die diesen Dateityp unterstützt, um verwendet zu werden. Ein symbolischer Link ist auf Dateisystemebene und wird von allen als Originaldatei angesehen. Eine Anwendung benötigt keine besondere Unterstützung, um einen symbolischen Link zu verwenden.

Wenn Sie mit Powershell eine Verknüpfung zum Ausführen als Administrator erstellen möchten, können Sie diese verwenden

$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)

Wenn jemand etwas anderes in einer .LNK-Datei ändern möchte, können Sie sich auf die offizielle Microsoft-Dokumentation beziehen .

JPBlanc
quelle
4
Ist es möglich, auch das Symbol für die Verknüpfung festzulegen?
Orad
6
Ein Symlink unterscheidet sich jedoch stark von einer Verknüpfung. Ein mit New-Itemin erstellter Symlink "${env:AppData}\Microsoft\Windows\SendTo"wird beispielsweise nicht im Explorer-Menü "Senden an" angezeigt und ermöglicht nicht das Anpassen von Verknüpfungseigenschaften wie Symbol oder Arbeitsverzeichnis.
Brian
Wenn ich das richtig verstehe und Sie einen symbolischen Link setzen, kann die Verknüpfung von jeder Shell und von jedem Verzeichnis aus verwendet werden. Es ist etwas wie das Einstellen einer Systemvariablen. Ist das richtig? Können Sie es auch für Verzeichnisse verwenden?
Ben Carp
1
Es ist überraschend, wie PowerShell Devs uns eher verzerrten und unverständlichen Code wie oben gezeigt schreiben lässt, anstatt nur die 3 Zeilen in einen neuen Parameter wie diesen zu implementieren : New-Item -ItemType SymbolicLink -RunAsAdmin ....
not2qubit
1
@ Luke, aber natürlich ist es ein Explorer-Link. Wenn Sie also darauf doppelklicken, wird calc.exe gestartet. Dies gilt auch, wenn Sie es mit PowerShell ( & C:\temp\calc.lnk) starten . Was erwartest du ?
JPBlanc