Board logo

标题: [文本处理] 如何通过批处理修改桌面url快捷方式的图标? [打印本页]

作者: 如你是我    时间: 2024-4-15 16:45     标题: 如何通过批处理修改桌面url快捷方式的图标?

比如我桌面有个百度的网页快捷方式
我想通过命令修改这个快捷方式的图标为%USERPROFILE%\Pictures\baidu.ico而不是默认的%SystemRoot%\System32\SHELL32.dll
怎么通过命令修改呢,而不是删了再建,因为网页快捷方式是从共享拷出来的,可能随时会换成别的网址
作者: czjt1234    时间: 2024-4-15 19:11

  1. url文件是个文本文件,可以用记事本打开并编辑
  2. 文件中,与快捷键和图标相关的行:
  3. IconFile  表示图标文件
  4. IconIndex 如果图标文含有多个图标,IconIndex表示图标的序号,第一个图标的序号为0
复制代码
好象可以直接按文本文件处理
作者: 如你是我    时间: 2024-4-16 09:52

回复 2# czjt1234


    用echo会添加iconfile 但是原来的iconfile还在 就没有替换成
作者: czjt1234    时间: 2024-4-17 10:45

  1. rem 另存为 ANSI 编码 bat
  2. ' & cls & cscript.exe /nologo /e:vbscript "%~f0" & pause & exit
  3. file = "百度.url"
  4. icon = "%USERPROFILE%\Pictures\baidu.ico"
  5. Call write_ini(file, , "InternetShortcut", "IconFile", icon)
  6. Call write_ini(file, , "InternetShortcut", "IconIndex", "0")
  7. Set oFSO = CreateObject("Scripting.FileSystemObject")
  8. Set oWshShell = CreateObject("WScript.Shell")
  9. Set oWshUrlShortcut = oWshShell.CreateShortcut(file)
  10. s = oWshUrlShortcut.TargetPath
  11. oWshUrlShortcut.TargetPath = s
  12. oWshUrlShortcut.Save()
  13. Function write_ini(ByVal file, ByVal charset, ByVal section, ByVal key, ByRef value)
  14.     Dim oFSO, oStream, oRegExp, oMatches, sINI, s, i, m, b, t, LineSeparator
  15.     Set oFSO          = CreateObject("Scripting.FileSystemObject")
  16.     Set oStream       = CreateObject("ADODB.Stream")
  17.     oStream.Type      = 2    'adTypeText
  18.     oStream.Mode      = 3    'adModeReadWrite
  19.     Set oRegExp       = New RegExp
  20.     oRegExp.Global    = True
  21.     oRegExp.MultiLine = True
  22.     If VarType(charset) = vbError Then charset = "GB2312"    '缺省参数
  23.     On Error Resume Next
  24.     If (VarType(file)    <> vbString)                                Or _
  25.        (VarType(section) <> vbString)                                Or _
  26.        (VarType(key)     <> vbString And VarType(key)   <> vbNull)   Or _
  27.        (VarType(value)   <> vbString And VarType(value) <> vbNull) Then _
  28.        write_ini = "至少有一个参数的类型错误" : Exit Function
  29.     If Left(section, 1)  <> "[" Then section = "[" & section
  30.     If Right(section, 1) <> "]" Then section = section & "]"    'section参数带不带[]都可以
  31.     Err.Clear()
  32.     oStream.Charset = charset
  33.     If Err.Number <> 0 Then write_ini = Err.Description : Exit Function
  34.     If Not oFSO.FileExists(file) Then    '文件不存在
  35.         oStream.Open()
  36.         oStream.WriteText section
  37.         Err.Clear()
  38.         oStream.SaveToFile file    '新建文件
  39.         If Err.Number <> 0 Then write_ini = "新建文件失败" : Exit Function
  40.         oStream.Close()
  41.     End If
  42.     oStream.Open()
  43.     Err.Clear()
  44.     oStream.LoadFromFile file
  45.     If Err.Number <> 0 Then write_ini = "读取文件失败" : Exit Function
  46.     sINI = oStream.ReadText()    '读取文件内容
  47.     oStream.Close()
  48.     LineSeparator = vbNewLine    '兼容各种分行符
  49.     If InStr(sINI, vbLf) > 0 Then LineSeparator = vbLf
  50.     If InStr(sINI, vbCr) > 0 Then LineSeparator = vbCr
  51.     If InStr(sINI, vbCrLf) > 0 Then LineSeparator = vbCrLf
  52.     sINI = sINI & LineSeparator    '添加分行符,防止最后一行不匹配正则表达式
  53.     oRegExp.Pattern = "^(.+)\r"
  54.     If LineSeparator = vbLf Then oRegExp.Pattern = "^(.+)\n"
  55.     m = -1    '用于标志小节名是否存在
  56.     Set oMatches = oRegExp.Execute(sINI)  '兼容小节名含有特殊字符的情况,兼容其它行含小节名的情况
  57.     For i = 0 To oMatches.Count - 1
  58.         If LCase(oMatches.Item(i).SubMatches.Item(0)) = LCase(section) Then m = i : Exit For
  59.     Next
  60.     If m = -1 Then sINI = sINI & section & LineSeparator    '小节名不存在,在文末添加小节名
  61.     '目标小节已存在,开始处理键名键值
  62.     b = False    'False非目标小节,True是目标小节
  63.     s = 0        '0未处理目标小节,1已处理目标小节未处理目标键名,2已处理目标小节和目标键名
  64.     t = ""       '新的sINI文本
  65.     Set oMatches = oRegExp.Execute(sINI)
  66.     For i = 0 To oMatches.Count - 1
  67.         m = oMatches.Item(i).SubMatches.Item(0)
  68.         If LCase(m) = LCase(section) Then    '目标小节
  69.             b = True
  70.             s = 1
  71.             If VarType(key) <> vbNull Then t = t & m & LineSeparator
  72.         ElseIf Left(m, 1) = "[" And Right(m, 1) = "]" Then    '其它小节
  73.             b = False
  74.             If s = 1 Then
  75.                 If VarType(value) <> vbNull And VarType(key) <> vbNull Then
  76.                     t = t & key & "=" & value & LineSeparator & m & LineSeparator
  77.                 Else
  78.                     t = t & m & LineSeparator
  79.                 End If
  80.                 s = 2
  81.             Else
  82.                 t = t & m & LineSeparator
  83.             End If
  84.         Else                     '键名键值行、注释行
  85.             If b = False Then    '非目标小节
  86.                 t = t & m & LineSeparator
  87.             Else                 '目标小节
  88.                 If VarType(key) = vbNull Then                      '删除目标小节
  89.                     s = 2
  90.                 ElseIf LCase(Split(m ,"=")(0)) = LCase(key) Then   '目标键名
  91.                     If VarType(value) = vbNull Then                '删除目标键名
  92.                     Else
  93.                         t = t & key & "=" & value & LineSeparator  '修改键值
  94.                     End If
  95.                     s = 2
  96.                 Else                                               '非目标键名
  97.                     t = t & m & LineSeparator
  98.                 End If
  99.             End If
  100.         End If
  101.     Next
  102.     If s = 1 And VarType(value) <> vbNull And VarType(key) <> vbNull Then    '新建目标键名
  103.         t = t & key & "=" & value & LineSeparator
  104.     End If
  105.     t = RePlace(t, LineSeparator & "[", LineSeparator & LineSeparator & "[")
  106.     oStream.Open()
  107.     oStream.WriteText t
  108.     Err.Clear()
  109.     oStream.SaveToFile file, 2    'adSaveCreateOverWrite 覆盖写入文件
  110.     If Err.Number <> 0 Then write_ini = "写入文件失败" : Exit Function
  111.     oStream.Close()
  112.     write_ini = "写入成功" & Len(t) & "字符" & LineSeparator & t
  113. End Function
复制代码

作者: aloha20200628    时间: 2024-4-17 19:25

本帖最后由 aloha20200628 于 2024-4-17 19:43 编辑

回复 1# 如你是我

用批处理脚本修改url快捷方式图标不同于lnk快捷方式图标,后者能即时更新,而前者似乎须重启资源管理器方可生效。楼主可试试以下批处理脚本...
  1. @echo off &setlocal
  2. set/p "sc=从桌面中拖入一个url快捷方式:" &if not defined sc exit/b
  3. set "sc=%sc:"=%"
  4. if /i "%sc:~-4%" neq ".url" exit/b
  5. set/p "ip=拖入一个新的图标文件:" &if not defined ip exit/b
  6. set "ip=%ip:"=%"
  7. echo,[InternetShortcut]>"_sc.tmp"
  8. (for /f "usebackq skip=1 tokens=1* delims==" %%a in ("%sc%") do (
  9. if /i "%%a"=="iconfile" (echo,%%a="%ip%") else if /i "%%a"=="iconindex" (echo,%%a=0) else echo,%%a=%%b
  10. ))>>"_sc.tmp"
  11. (move /y "_sc.tmp" "%sc%"
  12. taskkill /f /im explorer.exe & start explorer.exe)>nul 2>nul
  13. exit/b
复制代码
备注》重启资源管理器会重排桌面所有快捷方式图标,若当前未采用“自动排列图标”布局,则在运行本脚本时须预先取消勾选“自动排列图标”(桌面空白处右键菜单>查看>自动排列图标)





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2