如何通过批处理文件设置快捷方式的图标?

Posted

技术标签:

【中文标题】如何通过批处理文件设置快捷方式的图标?【英文标题】:how do you set the icon of a shortcut through a batch file? 【发布时间】:2021-09-30 18:10:54 【问题描述】:

我正在尝试创建一个脚本,该脚本将创建目标批处理文件的快捷方式并将图标设置为 .ico 或 .dll 图标文件:

@echo off
@echo Writing CreateShortcut script
@echo Set oWS = WScript.CreateObject("WScript.Shell") >> CreateShortcut.vbs

@echo sLinkFile = "C:\rustserver\Batch Files\rustserver\launcher\Test1.lnk" >> CreateShortcut.vbs
@echo Set oLink = oWS.CreateShortcut(sLinkFile) >> CreateShortcut.vbs
@echo oLink.TargetPath = "C:\rustserver\Batch Files\Test1.bat" >> CreateShortcut.vbs
@echo oLink.Save >> CreateShortcut.vbs
pause

@echo Writing EditShortcut script
@echo Set iWS = WScript.CreateObject("Shell.Application") >> EditShortcut.vbs

@echo sIconFile.IconLocation "C:\rustserver\Batch Files\rustserver\launcher\Icons\CompilerIcon.ico",0 >> EditShortcut.vbs
@echo Set oIcon = iWS.EditShortcut(sIconFile) >> EditShortcut.vbs
@echo oIcon.TargetPath = "C:\rustserver\Batch Files\rustserver\launcher\Test1.lnk" >> EditShortcut.vbs
@echo oIcon.Save >> EditShortcut.vbs
pause

@echo Running .vbs scripts...
cscript CreateShortcut.vbs
cscript EditShortcut.vbs
pause

@echo Deleting .vbs scripts...
del CreateShortcut.vbs
del EditShortcut.vbs
pause

@echo Deleting test shortcuts...
del Test1.lnk
pause

将 .bat 文件转换为 .exe 不是一种选择,因为在每个批处理文件之间需要重新配置一些值。

就像我可以让脚本创建批处理文件的快捷方式一样,但无论我尝试什么,我都无法让脚本设置快捷方式的图标...

【问题讨论】:

【参考方案1】:

鉴于您自己发布的解决方案,您可以通过批处理文件以更简单的方式完成此操作。

以下内容仅在关闭文件之前打开您的文件以写入一次,而您的文件对每一行都执行此操作。你只需要一个vbscript,创建快捷方式,你不需要创建一个,然后再编辑它。

::https://***.com/q/68502166
@(  Echo Set WshShell = WScript.CreateObject("WScript.Shell"^)
    Echo Set oShellLink = WshShell.CreateShortcut("C:\rustserver\Batch Files\rustserver\launcher\Test1.lnk"^)
    Echo oShellLink.TargetPath = """C:\rustserver\Batch Files\Test1.bat"""
    Echo oShellLink.WindowStyle = 1
    Echo oShellLink.Hotkey = "CTRL+SHIFT+B"
    Echo oShellLink.IconLocation = "C:\rustserver\Batch Files\rustserver\launcher\Icons\SMIcons.dll, 0"
    Echo oShellLink.Description = "Run Windows Command Script"
    Echo oShellLink.WorkingDirectory = "C:\rustserver\Batch Files"
    Echo oShellLink.Save) 1>"CreateShortcut.vbs"
@%SystemRoot%\System32\cscript.exe //NoLogo "CreateShortcut.vbs" && Del "CreateShortcut.vbs"

使用上述方法要记住的主要事情是,因为重定向的写入块是带括号的,您需要转义任何嵌套的右括号,(带有插入符号),以防止外部块被过早关闭。


但是有一种更简单的方法可以做到这一点,它不需要你转义任何东西,或者动态地写入、运行,然后删除另一个文件。您可以使用批处理/WSH 多语言:

<!-- ::https://***.com/q/68502166
@%SystemRoot%\System32\cscript.exe //NoLogo "%~f0?.wsf"
@Exit /B
-->
<Job><Script Language="VBScript">
Set WshShell = WScript.CreateObject("WScript.Shell")
Set oShellLink = WshShell.CreateShortcut("C:\rustserver\Batch Files\rustserver\launcher\Test1.lnk")
oShellLink.TargetPath = """C:\rustserver\Batch Files\Test1.bat"""
oShellLink.WindowStyle = 1
oShellLink.Hotkey = "CTRL+SHIFT+B"
oShellLink.IconLocation = "C:\rustserver\Batch Files\rustserver\launcher\Icons\SMIcons.dll, 0"
oShellLink.Description = "Run Windows Command Script"
oShellLink.WorkingDirectory = "C:\rustserver\Batch Files"
oShellLink.Save
</Script></Job>

【讨论】:

【参考方案2】:

“不被识别为内部或外部命令”。是由于示例中的斜引号引起的。将斜引号更改为直引号,然后重试。像这样:

Const DESKTOP = &H10&
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.NameSpace(DESKTOP)
Set objFolderItem = objFolder.ParseName("Test Shortcut.lnk")
Set objShortcut = objFolderItem.GetLink
objShortcut.SetIconLocation "C:\Windows\System32\SHELL32.dll", 13
objShortcut.Save

注意:OP 在我回答之后(或同时)编辑了问题。请参阅原始问题。

【讨论】:

实际上显然问题来自这部分代码...我需要将目标文件包含在引用的@echo Set objFolder = objShell.NameSpace("C:\rustserver\") &gt;&gt; EditShortcut.vbs @echo Set objFolderItem = objFolder.ParseName("Batch Files\rustserver\launcher\Test1.lnk") &gt;&gt; EditShortcut.vbs 【参考方案3】:

想通了。对于遇到相同问题的任何人,我会在下面留下脚本的工作版本,如果您对它做同样的事情,您应该能够理解并相应地修改它。

@echo off
@echo Set oWS = WScript.CreateObject("WScript.Shell") >> CreateShortcut.vbs
@echo Set oSA = CreateObject("Shell.Application") >> EditShortcut.vbs

@echo sLinkFile = "C:\rustserver\Batch Files\rustserver\launcher\Test1.lnk" >> CreateShortcut.vbs
@echo Set oLink = oWS.CreateShortcut(sLinkFile) >> CreateShortcut.vbs
@echo oLink.TargetPath = "C:\rustserver\Batch Files\Test1.bat" >> CreateShortcut.vbs
@echo oLink.Save >> CreateShortcut.vbs

@echo Set objShell = CreateObject("Shell.Application") >> EditShortcut.vbs
@echo Set objFolder = objShell.NameSpace("C:\rustserver\") >> EditShortcut.vbs
@echo Set objFolderItem = objFolder.ParseName("Batch Files\rustserver\launcher\Test1.lnk") >> EditShortcut.vbs
@echo Set objShortcut = objFolderItem.GetLink >> EditShortcut.vbs
@echo objShortcut.SetIconLocation "C:\rustserver\Batch Files\rustserver\launcher\Icons\SMIcons.dll", 0 >> EditShortcut.vbs
@echo objShortcut.Save >> EditShortcut.vbs

cscript CreateShortcut.vbs
cscript EditShortcut.vbs
del CreateShortcut.vbs
del EditShortcut.vbs

【讨论】:

欢迎来到 Stack Overflow。请将您的答案作为答案发布,同时将您的问题集中在原始问题上。这是人们期望它采用的格式,并使未来的读者更容易理解问题和解决方案。 (可以通过澄清或其他详细信息来更新您的问题,而不是提供答案。)

以上是关于如何通过批处理文件设置快捷方式的图标?的主要内容,如果未能解决你的问题,请参考以下文章

如何把桌面图标快捷方式做成动态的

桌面快捷方式如何创建

如何将任意文件固定在 Win10 的开始屏幕中

win10怎么把开始菜单中程序图标设置桌面快捷方式

Windows 命令行批处理脚本创建快捷方式

如何将图标添加到 WPF 应用程序桌面快捷方式?