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

问题描述

我正在尝试创建一个脚本,该脚本将创建目标批处理文件的快捷方式并将图标设置为 .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 不是一个选项,因为在每个批处理文件之间需要重新配置一些值。

就像我可以得到脚本来创建批处理文件的快捷方式就好了但是无论我尝试什么我都无法得到脚本来设置快捷方式的图标...

解决方法

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

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 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
,

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

在关闭文件之前,以下内容仅打开您的文件一次,而您的文件则是针对每一行进行的。你只需要一个vbscript,创建快捷方式,你不需要创建一个,然后再编辑。

::https://stackoverflow.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://stackoverflow.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>