Як створити ярлик за допомогою PowerShell


90

Я хочу створити ярлик із PowerShell для цього виконуваного файлу:

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

Як це можна зробити?


2
Якщо ви хочете запустити ярлик від імені адміністратора, ви можете використати цю відповідь .
JPBlanc

Вам слід серйозно подумати про прийняття відповіді @ JPBlanc. Це єдиний лайнер
Каньйон Колоба

@KolobCanyon Будьте обережні, моя відповідь - символічне посилання, а не ярлик.
JPBlanc,

Відповіді:


139

Я не знаю жодного власного командлета в 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()

1
Дуже незначний, але лише для узгодженості я б хотів, щоб синтаксис Set-ShortCutкомандлета був більш схожим MKLINK, або Set-Aliasтам, де псевдонім або посилання є першим аргументом, а потім ціллю. param ( [string]$LinkPath, [string]$TargetPath )
орад

Одним обмеженням компонента WshShell COM або cmd /c mklinkобхідних шляхів є дуже обмежений набір символів для іменування файлу .lnk. Наприклад, ім'я, що містить →, не вдасться. Одним із способів обійти це, якщо вам потрібна краща підтримка символів, є [Web.HttpUtility]::UrlEncode()(після Add-Type -AN System.Web) ім'я файлу під час створення файлу .lnk, а потім перейменувати його в UrlDecoded ім'я за допомогою Rename-Item.
бріанар

При створенні ярлика на справжньому робочому столі (на противагу припущенню жорстко закодованого шляху, який може бути, а може і не бути правдою, несправедливість, яку я спостерігав багато разів), SpecialFoldersметод об'єкта WScript може стати в нагоді: $WshShell.SpecialFolders("Desktop")дасть вам справжній шлях до папці робочого столу, яку ви зможете використовувати згодом під час дзвінка CreateShortcut.
amn

Я використовував цей метод з 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.
Бен Карп

44

Починаючи з 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 .


4
Чи можна також встановити піктограму ярлика?
орад

7
Однак символічне посилання сильно відрізняється від ярлика. Символьне посилання, створене за допомогою New-Itemin "${env:AppData}\Microsoft\Windows\SendTo", не відображатиметься в меню Надіслати провіднику, наприклад, і не дозволяє налаштовувати властивості ярликів, такі як значок або робочий каталог.
бріанар

Якщо я правильно розумію, якщо ви встановите символічне посилання, ярлик можна використовувати з будь-якої оболонки та з будь-якого каталогу. Це дещо схоже на встановлення системної змінної. Це правильно? Чи можете ви також використовувати його для каталогів?
Бен Карп,

1
Це дивно , як PowerShell Dev це швидше у нас пишуть спотворено і незрозумілий код , як показано вище, замість того , щоб просто реалізації 3 рядки в новий параметр , як це: New-Item -ItemType SymbolicLink -RunAsAdmin ....
not2qubit

1
@Luke, але, звичайно, це посилання для дослідника, тому, коли ви двічі клацаєте по ньому, він запускає calc.exe. Так і відбувається, коли ви запускаєте його за допомогою PowerShell ( & C:\temp\calc.lnk). Що ти очікуєш ?
JPBlanc,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.