Come creare un collegamento utilizzando PowerShell


90

Voglio creare un collegamento con PowerShell per questo eseguibile:

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

Come si può fare?


2
Se desideri eseguire un collegamento come amministratore, puoi utilizzare questa risposta .
JPBlanc

Dovresti considerare seriamente di accettare la risposta di @ JPBlanc. È una nave di linea
Kolob Canyon

@KolobCanyon Stai attento, la mia risposta è un collegamento simbolico, non una scorciatoia.
JPBlanc

Risposte:


139

Non conosco alcun cmdlet nativo in PowerShell, ma puoi invece utilizzare l'oggetto 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()

puoi creare uno script PowerShell salvandolo come set-shortcut.ps1 nel tuo $ pwd

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

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

e chiamalo così

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

Se vuoi passare argomenti all'exe di destinazione, puoi farlo:

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

prima di $ Shortcut.Save ().

Per comodità, ecco una versione modificata di set-shortcut.ps1. Accetta argomenti come secondo parametro.

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

1
Molto minore, ma solo per motivi di coerenza vorrei che la sintassi del Set-ShortCutcmdlet fosse più simile MKLINK, o Set-Aliasdove l'alias o il collegamento viene come primo argomento e poi come destinazione. param ( [string]$LinkPath, [string]$TargetPath )
orad

Una limitazione del componente COM di WshShell o delle cmd /c mklinksoluzioni alternative è un set di caratteri molto limitato per la denominazione del file .lnk. Ad esempio, un nome contenente un → fallirà. Un modo per aggirare questo, se hai bisogno di un migliore supporto per i caratteri, è quello di [Web.HttpUtility]::UrlEncode()(dopo Add-Type -AN System.Web) il nome del file durante la creazione del file .lnk, quindi rinominarlo con il nome UrlDecoded usando Rename-Item.
brianary

Quando si crea un collegamento sul desktop reale (al contrario di assumere un percorso hardcoded che può o non può essere vero, un errore che ho osservato molte volte), il SpecialFoldersmetodo di un oggetto WScript può tornare utile: $WshShell.SpecialFolders("Desktop")ti darà il vero percorso per la cartella del desktop, che puoi utilizzare successivamente durante la chiamata CreateShortcut.
amn

Ho usato questo metodo con PS C:\Users\${myUser} $Shortcut = $WshShell.CreateShortcut("$C:\Users\${myUser}\home.lnk"). Ha creato una scorciatoia che può essere vista da Windows Explorer, ma quando ho digitato cd homeil PS stesso ricevo un errorecd : Cannot find path 'C:\Users\carpb\home' because it does not exist.
Ben Carp

44

A partire da PowerShell 5.0 New-Item, Remove-Iteme Get-ChildItemsono stati migliorati per supportare la creazione e la gestione di collegamenti simbolici. Il parametro ItemType per New-Itemaccetta un nuovo valore, SymbolicLink. È ora possibile creare collegamenti simbolici in una singola riga eseguendo il cmdlet New-Item.

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

Attenzione una SymbolicLink è diverso da un collegamento , i collegamenti sono solo un file. Hanno una dimensione (una piccola, che fa riferimento solo a dove puntano) e richiedono un'applicazione che supporti quel tipo di file per essere utilizzati. Un collegamento simbolico è a livello di filesystem e tutto lo vede come il file originale. Un'applicazione non necessita di alcun supporto speciale per utilizzare un collegamento simbolico.

Ad ogni modo, se vuoi creare un collegamento Esegui come amministratore usando Powershell puoi usare

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

Se qualcuno vuole cambiare qualcos'altro in un file .LNK puoi fare riferimento alla documentazione ufficiale di Microsoft .


4
È possibile impostare anche l'icona del collegamento?
orad

7
Tuttavia, un collegamento simbolico è molto diverso da un collegamento. Un collegamento simbolico creato utilizzando New-Itemin "${env:AppData}\Microsoft\Windows\SendTo"non verrà visualizzato nel menu Invia a di Explorer, ad esempio, e non consente la personalizzazione delle proprietà dei collegamenti come l'icona o la directory di lavoro.
brianary

Se ho capito bene, se imposti un collegamento simbolico, il collegamento può essere utilizzato da qualsiasi shell e da qualsiasi directory. È un po 'come impostare una var di sistema. È corretto? Puoi usarlo anche per le directory?
Ben Carp

1
E 'sorprendente come PowerShell Dev piuttosto hanno Scrivici contorte e il codice incomprensibile come mostrato sopra, invece di attuare le linee 3 in un nuovo parametro in questo modo: New-Item -ItemType SymbolicLink -RunAsAdmin ....
not2qubit

1
@Luke, ma ovviamente è un collegamento di esplorazione, quindi quando fai doppio clic su di esso, viene avviato calc.exe. Così succede quando lo avvii con PowerShell ( & C:\temp\calc.lnk). Cosa ti aspetti ?
JPBlanc
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.