ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1463|回复: 14

[求助] 有没有懂vbs的

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-1-30 11:38 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册



  1. Set ofso = CreateObject("Scripting.FileSystemObject")
  2. SourceFolder = ofso.GetParentFolderName(Wscript.ScriptFullName)

  3. Const FONTS = &H14&

  4. Set objShell  = CreateObject("Shell.Application")
  5. Set oSource   = objShell.Namespace(SourceFolder)
  6. Set oWinFonts = objShell.Namespace(FONTS)

  7. ' Lame VBscript needs 4 f*ing lines instead of "if (/\.ttf$/i) " ...
  8. Set rxTTF = New RegExp
  9. rxTTF.IgnoreCase = True
  10. rxTTF.Pattern = "\.ttf$"

  11. FOR EACH FontFile IN oSource.Items()
  12.     IF rxTTF.Test(FontFile.Path) THEN   
  13.         oWinFonts.CopyHere FontFile.Path,20
  14.     END IF
  15. NEXT
复制代码



这段代码是.vbs文件,用于安装当前文件夹下的ttf字体文件的。 image.png
想问一下如何静默安装,已存在则直接覆盖。
这个CopyHere( vItem,[ vOptions ])有两个参数,每个参数我都试过了,也相加过,都不行。

(4)

不显示进度对话框。

(8)

如果已有具有目标名称的文件,则为在移动、复制或重命名操作中对新名称进行操作的文件。

(16)

对于显示的任何对话框,请响应“全部是”。

(64)

如果可能,请保留撤消信息。

(128)

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-1-30 11:41 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
附件如下。

install font.rar

35.43 KB, 下载次数: 16

TA的精华主题

TA的得分主题

发表于 2023-1-30 13:36 | 显示全部楼层
装前检测一下字体名字是否存在。

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-1-30 13:45 | 显示全部楼层
smsn 发表于 2023-1-30 13:36
装前检测一下字体名字是否存在。

有另外一种脚本,不过有缺陷,基本上是判断不出来字体是否存在。

源码作者的原话:我对已经安装的字体是采取建立字体列表,然后判断当前安装的字体是否存在于字体列表,字体列表的来源是已经安装的字体在系统的注册名(存在于注册表中)和已经安装的字体文件名。唯一遗憾的是我是通过比判断安装字体的文件名是否在字体列表中来判断字体是否安装,这里的问题主要是待安装的字体文件名不一定与字体真实的名字一致,字体真实的名字是需要读取二进制字体文件从中来获取的,这样脚本又复杂了,所以放弃了这种方式。


installFonts.rar

38 KB, 下载次数: 5

TA的精华主题

TA的得分主题

发表于 2023-1-30 14:01 | 显示全部楼层
本帖最后由 perfect131 于 2023-1-31 15:03 编辑

这样 , 可以先检查是否已安装
  1. Const FOF_SILENT = &H4&
  2. Const FOF_RENAMEONCOLLISION = &H8&
  3. Const FOF_NOCONFIRMATION = &H10&
  4. Const FOF_ALLOWUNDO = &H40&
  5. Const FOF_FILESONLY = &H80&
  6. Const FOF_SIMPLEPROGRESS = &H100&
  7. Const FOF_NOCONFIRMMKDIR = &H200&
  8. Const FOF_NOERRORUI = &H400&
  9. Const FOF_NOCOPYSECURITYATTRIBS = &H800&
  10. Const FOF_NORECURSION = &H1000&
  11. Const FOF_NO_CONNECTED_ELEMENTS = &H2000&
  12. Dim cFlags
  13. ''cFlags = FOF_SILENT + FOF_NOCONFIRMATION + FOF_NOERRORUI
  14. cFlags = FOF_SILENT
  15. Set objFSO = CreateObject("Scripting.FileSystemObject")
  16. Set font = CreateObject("Shell.Application").NameSpace("shell:fonts")
  17. tmp0=Wscript.CreateObject("Wscript.Shell").SpecialFolders("fonts") & ""'字体文件所在文件夹
  18. ''系统字体 遍历
  19. Set Folder = objFSO.GetFolder("C:\Windows\Fonts")
  20. set dic = CreateObject("Scripting.Dictionary")
  21. For Each File In Folder.Files
  22.     If instr(LCase(File.Name),".ttf") Then
  23.         dic(LCase(File.Name))=""
  24.     End If
  25. Next
  26. ''用户特定的字体 遍历
  27. Set oShell = CreateObject("WScript.Shell")
  28. strHomeFolder = oShell.ExpandEnvironmentStrings("%USERPROFILE%") &"\AppData\Local\Microsoft\Windows\Fonts"
  29. Set Folder1 = objFSO.GetFolder(strHomeFolder)
  30. For Each File1 In Folder1.Files
  31.     If instr(LCase(File1.Name),".ttf") Then
  32.         dic(LCase(File1.Name))=""
  33.     End If
  34. Next
  35. '''.\ 当前目录
  36. for each f in objFSO.getfolder(".").files '文件夹所有文件
  37.     tmp1=LCase(f.path)  '''''完整文件名和路径
  38.     tmp2=right(tmp1,3)  ''''扩展名
  39.     tmp3=LCase(f.name) ''''文件名
  40.     '''判断字体是否 已装
  41.     if tmp2="ttf" and not dic.exists(tmp3) then  font.CopyHere tmp1, cFlags
  42. next
  43. msgbox "OK!!!!!!"
  44. Set objFSO = nothing
  45. Set font = nothing
  46. Set oShell =  nothing
  47. set dic =  nothing
复制代码
大神们赐个静默安装吧(不显示进度对话框),上面这段不能静默, 估计 cFlags 没写对

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-1-30 16:44 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-1-30 17:10 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-1-30 21:50 来自手机 | 显示全部楼层
本帖最后由 lss001 于 2023-2-1 11:23 编辑

Set fso = CreateObject("Scripting.FileSystemObject")
SFolder = fso.GetParentFolderName(Wscript.ScriptFullName)

Set oShell = CreateObject("Shell.Application")
Set oSource = oShell.Namespace(SFolder)
Set oWinFonts = oShell.Namespace(20)
Set oUser = oShell.Namespace(28)
UserFonts = oUser.self.Path & "\Microsoft\Windows\Fonts\"

Set rxTTF = CreateObject("vbscript.RegExp")
rxTTF.IgnoreCase = True
rxTTF.Pattern = "\.ttf$"

On Error Resume Next
For Each FontFile In oSource.Items()
    If rxTTF.Test(FontFile.Path) Then
        y = fso.GetBaseName(FontFile.Path)
        Set UserFiles = fso.GetFolder(UserFonts).Files
        x = 0 '判断用户字体
        For Each f In UserFiles
            If InStr(f.Name, y) Then
               x = 1
            End If
        Next
        If x = 0 Then
            oWinFonts.CopyHere FontFile.Path
        End If
    End If
Next

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-1-31 10:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
lss001 发表于 2023-1-30 21:50
Set ofs = CreateObject("Scripting.FileSystemObject")
SourceFolder = ofs.GetParentFolderName(Wscript ...

一样的 还是提示字体已安装,是否替换。

TA的精华主题

TA的得分主题

发表于 2023-1-31 11:10 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

楼上代码已更新,在审核
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-9-27 19:12 , Processed in 0.046897 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表