使用 PowerShell 创建快捷方式

Creating a shortcut with PowerShell

我正在尝试使用打开证书的 PowerShell 创建快捷方式。

$shortcut = (New-Object -ComObject Wscript.Shell).Createshortcut("desktop\Certificates.lnk")
$shortcut.TargetPath = ("C:\Windows\System32\rundll32.exe cryptui.dll,CryptUIStartCertMgr")
$shortcut.IconLocation = ("%SystemRoot%\System32\SHELL32.DLL, 44")
$shortcut.Save()

我目前创建的快捷方式的目标是...

"C:\Windows\System32\rundll32.exe cryptui.dll,CryptUIStartCertMgr"

当快捷方式的目标包含“”时,它不起作用。我试图从脚本中删除它们,但随后它启动了一次证书 gui,并在桌面上创建了一个针对此 PC 而不是证书的快捷方式。

目标可执行文件及其参数必须单独指定,即分别在.TargetPath.Arguments属性中指定。

(无论你分配给 .TargetPath 什么都被认为 只是 一个可执行文件路径,如果它包含空格,它会自动并且总是包含在 "..." 给你。)

因此:

$shortcut = (New-Object -ComObject Wscript.Shell).CreateShortcut('desktop\Certificates.lnk')
$shortcut.TargetPath = 'C:\Windows\System32\rundll32.exe' # Executable only
$shortcut.Arguments = 'cryptui.dll,CryptUIStartCertMgr'   # Args to pass to executable.
$shortcut.IconLocation = '%SystemRoot%\System32\SHELL32.DLL, 44'
$shortcut.Save()

请注意,鉴于您的代码中不需要字符串扩展(插值),我已经删除了不必要的 (...) 附件,并且为了概念清晰起见,已从 expandable (double-quoted) strings ("...") to verbatim (single-quoted) strings ('...') 切换。

也就是说,为了完全稳健,您可以将 'C:\Windows\System32\rundll32.exe' 替换为 "$env:SystemRoot\System32\rundll32.exe" - 用于 即时 扩展 - 或 '%SystemRoot%\System32\rundll32.exe' 用于让 .CreateShortcut() 执行扩展。[1]


[1] 生成的快捷方式文件 (.lnk) 似乎存储 扩展和未扩展的值。当 在文件资源管理器中检查 快捷方式文件的属性时 - 令人惊讶的是还通过获取 (New-Object -ComObject Wscript.Shell).CreateShortcut() 创建的 WshShortcut 对象的 属性 值 - 你只见过 expanded 值。