如何使用 PowerShell 创建快捷方式

Posted

技术标签:

【中文标题】如何使用 PowerShell 创建快捷方式【英文标题】:How to create a shortcut using PowerShell 【发布时间】:2012-03-30 21:43:12 【问题描述】:

我想用 PowerShell 为这个可执行文件创建一个快捷方式:

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

如何做到这一点?

【问题讨论】:

如果您想以管理员身份运行快捷方式,您可以使用this answer。 您应该认真考虑接受@JPBlanc 的回答。这是一个班轮 @KolobCanyon 小心,我的回答是符号链接,而不是快捷方式。 【参考方案1】:

我不知道 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 中创建一个 powershell 脚本另存为 set-shortcut.ps1

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

【讨论】:

非常小,但只是为了保持一致性,我会让Set-ShortCut cmdlet 的语法更像MKLINK,或Set-Alias,其中别名或链接作为第一个参数,并且然后是目标。 param ( [string]$LinkPath, [string]$TargetPath ) WshShell COM 组件或cmd /c mklink 解决方法的一个限制是用于命名 .lnk 文件的字符集非常有限。例如,包含 → 的名称将失败。如果您需要更好的字符支持,解决此问题的一种方法是在创建 .lnk 文件时使用 [Web.HttpUtility]::UrlEncode()(在 Add-Type -AN System.Web 之后)文件名,然后使用 Rename-Item 将其重命名为 UrlDecoded 名称。 true 桌面上创建快捷方式时(而不是假设硬编码路径可能是也可能不是,这是我多次观察到的弊端),@ WScript 对象的 987654333@ 方法可能会派上用场:$WshShell.SpecialFolders("Desktop") 将为您提供桌面文件夹的真实路径,您可以在随后调用 CreateShortcut 时使用该路径。 我在PS C:\Users\$myUser $Shortcut = $WshShell.CreateShortcut("$C:\Users\$myUser\home.lnk") 中使用了这种方法。它创建了一个可以从 Windows 资源管理器中看到的快捷方式,但是当我在 PS 本身中键入 cd home 时,我收到错误 cd : Cannot find path 'C:\Users\carpb\home' because it does not exist. amn 的评论 +1 - 用户可以更改桌面和文档等特殊文件夹的位置,因此它不一定位于 $Home 文件夹下。获取真实桌面位置的另一种方法是[Environment]::GetFolderPath("Desktop")【参考方案2】:

开始 PowerShell 5.0 New-ItemRemove-ItemGet-ChildItem 已得到增强,以支持创建和管理符号链接。 New-ItemItemType 参数接受一个新值 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 文件中的其他内容,您可以参考official Microsoft documentation。

【讨论】:

是否可以同时设置快捷方式的图标? 符号链接与快捷方式非常不同。使用 "$env:AppData\Microsoft\Windows\SendTo" 中的 New-Item 创建的符号链接不会显示在资源管理器发送到菜单中,例如,并且不允许自定义快捷方式属性,如图标或工作目录。 如果我理解正确,如果您设置了符号链接,则可以从任何 shell 和任何目录使用快捷方式。这有点像设置系统变量。它是否正确?你也可以将它用于目录吗? 令人惊讶的是,PowerShell 开发人员宁愿让我们编写如上所示的扭曲和难以理解的代码,而不是仅仅将 3 行代码实现为这样的新参数:New-Item -ItemType SymbolicLink -RunAsAdmin ... @Luke,当然,这是一个资源管理器链接,所以当你双击它时,它会启动 calc.exe。当您使用 PowerShell (& C:\temp\calc.lnk) 启动它时,它也是如此。你期待什么?

以上是关于如何使用 PowerShell 创建快捷方式的主要内容,如果未能解决你的问题,请参考以下文章

您如何使 Android“主页”快捷方式绕过它指向的应用程序的历史记录?

powershell PowerShell:重新创建LastPass桌面快捷方式

powershell 创建快捷方式

如何在不捐赠意图或使用快捷方式的情况下利用 Siri 创建自定义对象?

如何做一个快捷方式使打开一个软件后自动关闭一个软件

知道如何使用 powershell/cli 或任何其他方式获取/查询其中创建了 Queue/table/file/blob 的存储帐户列表吗?