Comment créer un raccourci à l'aide de PowerShell

90

Je souhaite créer un raccourci avec PowerShell pour cet exécutable:

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

Comment cela peut-il être fait?

cethint
la source
2
Si vous souhaitez exécuter un raccourci en tant qu'administrateur, vous pouvez utiliser cette réponse .
JPBlanc
Vous devriez sérieusement envisager d'accepter la réponse de @ JPBlanc. It's a one liner
Kolob Canyon
@KolobCanyon Attention, ma réponse est un lien symbolique, pas un raccourci.
JPBlanc

Réponses:

138

Je ne connais aucune applet de commande native dans PowerShell, mais vous pouvez utiliser un objet com à la place:

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

vous pouvez créer un script PowerShell sauvegardé sous set-shortcut.ps1 dans votre $ pwd

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

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

et appelle ça comme ça

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

Si vous souhaitez passer des arguments à l'exe cible, cela peut être fait par:

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

avant $ Shortcut.Save ().

Pour plus de commodité, voici une version modifiée de set-shortcut.ps1. Il accepte les arguments comme deuxième paramètre.

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.
la source
1
Très mineur, mais juste pour des raisons de cohérence, j'aurais Set-ShortCutplutôt la syntaxe de l' applet de commande MKLINK, ou Set-Aliasoù l'alias ou le lien vient en premier argument, puis la cible. param ( [string]$LinkPath, [string]$TargetPath )
orad
Une limitation du composant COM WshShell ou des cmd /c mklinksolutions de contournement est un jeu de caractères très limité pour nommer le fichier .lnk. Un nom contenant un → échouera, par exemple. Une façon de contourner ce problème , si vous avez besoin d'une meilleure prise en charge des caractères, consiste à [Web.HttpUtility]::UrlEncode()(après Add-Type -AN System.Web) le nom de fichier lors de la création du fichier .lnk, puis à le renommer en nom UrlDecoded en utilisant Rename-Item.
brianary
Lors de la création d'un raccourci sur un vrai bureau (par opposition à l'hypothèse d'un chemin codé en dur qui peut ou non être vrai, une faute professionnelle que j'ai observée à plusieurs reprises), la SpecialFoldersméthode d'un objet WScript peut être utile: $WshShell.SpecialFolders("Desktop")vous donnera le vrai chemin vers le dossier du bureau, que vous pourrez utiliser ultérieurement lors de l'appel CreateShortcut.
amn le
J'ai utilisé cette méthode avec PS C:\Users\${myUser} $Shortcut = $WshShell.CreateShortcut("$C:\Users\${myUser}\home.lnk"). Il a créé un raccourci qui peut être vu depuis l'explorateur Windows, mais quand j'ai tapé cd homedans le PS lui-même, j'obtiens une erreurcd : Cannot find path 'C:\Users\carpb\home' because it does not exist.
Ben Carp
44

À partir de PowerShell 5.0 New-Item, Remove-Itemet Get-ChildItemont été améliorés pour prendre en charge la création et la gestion des liens symboliques. Le paramètre ItemType pour New-Itemaccepte une nouvelle valeur, SymbolicLink. Vous pouvez désormais créer des liens symboliques sur une seule ligne en exécutant la cmdlet New-Item.

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

Attention, un SymbolicLink est différent d'un raccourci , les raccourcis ne sont qu'un fichier. Ils ont une taille (petite, qui fait simplement référence à l'endroit où ils pointent) et ils nécessitent une application pour prendre en charge ce type de fichier pour être utilisés. Un lien symbolique est au niveau du système de fichiers, et tout le voit comme le fichier d'origine. Une application n'a pas besoin de support particulier pour utiliser un lien symbolique.

Quoi qu'il en soit, si vous souhaitez créer un raccourci Exécuter en tant qu'administrateur à l' aide de Powershell, vous pouvez utiliser

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

Si quelqu'un veut changer quelque chose d'autre dans un fichier .LNK, vous pouvez vous référer à la documentation officielle de Microsoft .

JPBlanc
la source
4
Est-il possible de définir également l'icône du raccourci?
orad
6
Un lien symbolique est cependant très différent d'un raccourci. Un lien symbolique créé avec New-Itemin "${env:AppData}\Microsoft\Windows\SendTo"n'apparaîtra pas dans le menu Envoyer vers de l'explorateur, par exemple, et ne permet pas de personnaliser les propriétés du raccourci comme l'icône ou le répertoire de travail.
brianary
Si je comprends bien, si vous définissez un lien symbolique, le raccourci peut être utilisé depuis n'importe quel shell, et depuis n'importe quel répertoire. C'est un peu comme définir une variable système. Est-ce correct? Pouvez-vous également l'utiliser pour les répertoires?
Ben Carp
1
Il surprenant comment PowerShell Dev ont plutôt nous écrivons contorsionnées et le code incompréhensible comme illustré ci - dessus, au lieu de simplement mettre en œuvre les 3 lignes dans un nouveau paramètre comme ceci: New-Item -ItemType SymbolicLink -RunAsAdmin ....
not2qubit le
1
@Luke, mais bien sûr, c'est un lien d'explorateur, donc lorsque vous double-cliquez dessus, il démarre calc.exe. C'est le cas lorsque vous le démarrez avec PowerShell ( & C:\temp\calc.lnk). Qu'attendez-vous ?
JPBlanc