如何使用PowerShell创建快捷方式


90

我想使用PowerShell为该可执行文件创建快捷方式:

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

如何才能做到这一点?


2
如果要以管理员身份运行快捷方式,可以使用此答案
JPBlanc

您应该认真考虑接受@JPBlanc的回答。这是一个班轮
Kolob Canyon

@KolobCanyon请注意,我的回答是符号链接,而不是快捷方式。
JPBlanc

Answers:


139

我在Powershell中不知道任何本机cmdlet,但是可以使用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()

您可以在$ pwd中创建另存为set-shortcut.ps1的powershell脚本

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-ShortCutcmdlet的语法更像MKLINK,或者Set-Alias别名或链接是第一个参数,然后是目标。 param ( [string]$LinkPath, [string]$TargetPath )
orad 2014年

WshShell COM组件或cmd /c mklink变通办法的一个限制是,用于命名.lnk文件的字符集非常有限。例如,包含→的名称将失败。如果需要更好的字符支持,一种解决方法是在创建.lnk文件时[Web.HttpUtility]::UrlEncode()(在之后Add-Type -AN System.Web)文件名,然后使用Rename-Item将其重命名为UrlDecoded名称。
2015年

真实的桌面上创建快捷方式时(相对于假设硬编码路径可能是真实的还是真实的情况,这是我已经观察到很多次的弊端),SpecialFoldersWScript对象的方法可能会派上用场:$WshShell.SpecialFolders("Desktop")将为您提供真正的路径桌面文件夹,您可以在调用时随后使用它CreateShortcut
7

我将此方法用于PS C:\Users\${myUser} $Shortcut = $WshShell.CreateShortcut("$C:\Users\${myUser}\home.lnk")。它创建了一个可以从Windows资源管理器中看到的快捷方式,但是当我输入cd homePS本身时,我会遇到一个错误cd : Cannot find path 'C:\Users\carpb\home' because it does not exist.
Ben Carp

44

从PowerShell 5.0 New-ItemRemove-Item和开始,Get-ChildItem已进行了增强,以支持创建和管理符号链接。该ItemType的进行参数New-Item接受一个新值,SymbolicLink。现在,您可以通过运行New-Item cmdlet在一行中创建符号链接。

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
是否可以同时设置快捷方式的图标?
orad 2015年

6
但是,符号链接与快捷方式有很大不同。例如,使用New-Itemin创建的符号链接"${env:AppData}\Microsoft\Windows\SendTo"不会显示在资源管理器的“发送至”菜单中,并且不允许自定义快捷方式属性,例如图标或工作目录。
2015年

如果我理解正确,那么如果您设置符号链接,则可以在任何外壳程序和任何目录中使用该快捷方式。这有点像设置系统变量。它是否正确?您还可以将其用于目录吗?
本·卡尔

1
令人奇怪的PowerShell开发如何是相当有我们编写扭曲和难以理解的代码如上所示,而不是仅仅实现3线到这样一个新的参数:New-Item -ItemType SymbolicLink -RunAsAdmin ...
not2qubit

1
@Luke,但是,当然,它是一个资源管理器链接,因此,当您双击它时,它将启动calc.exe。启动PowerShell(& C:\temp\calc.lnk)时也是如此。你能指望什么 ?
JPBlanc
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.