Как создать ярлык с помощью PowerShell

92

Я хочу создать ярлык с помощью PowerShell для этого исполняемого файла:

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

Как это может быть сделано?

цетинт
источник
2
Если вы хотите запустить ярлык в качестве администратора, вы можете использовать этот ответ .
JPBlanc,
Вам следует серьезно подумать о том, чтобы принять ответ @ JPBlanc. Это один лайнер
Каньон Колоб
@KolobCanyon Будьте осторожны, мой ответ - символическая ссылка, а не ярлык.
JPBlanc

Ответы:

143

Я не знаю ни одного собственного командлета в PowerShell, но вместо этого вы можете использовать объект 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()

вы можете создать сценарий PowerShell, сохраненный как set-shortcut.ps1 в вашем $ pwd

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

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

и назовите это так

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

Если вы хотите передать аргументы целевому exe, это можно сделать следующим образом:

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

перед $ Shortcut.Save ().

Для удобства здесь представлена ​​модифицированная версия set-shortcut.ps1. Он принимает аргументы в качестве второго параметра.

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.
источник
1
Очень незначительно, но просто для единообразия я хотел бы, чтобы синтаксис Set-ShortCutкомандлета был больше похож на то MKLINK, Set-Aliasгде псевдоним или ссылка являются первым аргументом, а затем целью. param ( [string]$LinkPath, [string]$TargetPath )
orad
Одним из ограничений COM-компонента WshShell или cmd /c mklinkобходных путей является очень ограниченный набор символов для именования файла .lnk. Например, имя, содержащее →, не сработает. Один из способов обойти это, если вам нужна лучшая поддержка символов, - это [Web.HttpUtility]::UrlEncode()(после Add-Type -AN System.Web) имени файла при создании файла .lnk, а затем переименование его в имя UrlDecoded с помощью Rename-Item.
brianary
При создании ярлыка на истинном рабочем столе (в отличие от предположения о жестко заданном пути, который может быть или не быть правдой, злоупотребление служебным положением, которое я наблюдал много раз), SpecialFoldersметод объекта WScript может оказаться полезным: $WshShell.SpecialFolders("Desktop")даст вам истинный путь к папка на рабочем столе, которую вы можете использовать впоследствии при звонке CreateShortcut.
атп
Я использовал этот метод с PS C:\Users\${myUser} $Shortcut = $WshShell.CreateShortcut("$C:\Users\${myUser}\home.lnk"). Он создал ярлык, который можно увидеть из проводника Windows, но когда я ввел cd homeсам PS, я получил сообщение об ошибкеcd : Cannot find path 'C:\Users\carpb\home' because it does not exist.
Бен Карп
47

Начиная с PowerShell 5.0 New-Item, Remove-Itemи Get-ChildItemбыли расширены для поддержки создания символических ссылок и управления ими. Параметр ItemType для New-Itemпринимает новое значение SymbolicLink. Теперь вы можете создавать символические ссылки в одной строке, запустив командлет New-Item.

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

Будьте Осторожен SymbolicLink отличается от ярлыка , ярлыки просто файл. У них есть размер (маленький, просто указывает на то место, куда они указывают), и для использования им требуется приложение, поддерживающее этот тип файла. Символическая ссылка - это уровень файловой системы, и все воспринимают ее как исходный файл. Приложение не нуждается в специальной поддержке для использования символической ссылки.

В любом случае, если вы хотите создать ярлык для запуска от имени администратора с помощью Powershell, вы можете использовать

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

Если кто-то хочет изменить что-то еще в файле .LNK, вы можете обратиться к официальной документации Microsoft .

JPBlanc
источник
4
Можно ли еще и для ярлыка установить иконку?
orad
7
Тем не менее, символическая ссылка сильно отличается от ярлыка. Символическая ссылка, созданная с помощью New-Itemin "${env:AppData}\Microsoft\Windows\SendTo", не будет отображаться, например, в меню «Отправить» проводника и не позволяет настраивать свойства ярлыка, такие как значок или рабочий каталог.
brianary
Если я правильно понял, если установить символическую ссылку, ярлык можно использовать из любой оболочки и из любого каталога. Это немного похоже на установку системной переменной. Это верно? Вы также можете использовать его для каталогов?
Бен Карп
1
Это удивительно , как PowerShell Dev это скорее у нас пишут искажено и непонятный код , как показано выше, вместо того , чтобы просто реализации 3 строки в новый параметр , как это: New-Item -ItemType SymbolicLink -RunAsAdmin ....
not2qubit 09
1
@Luke, но, конечно, это ссылка проводника, поэтому, когда вы дважды щелкаете по ней, запускается calc.exe. Так происходит, когда вы запускаете его с помощью PowerShell ( & C:\temp\calc.lnk). Что вы ожидаете ?
JPBlanc