根据新系统要求,经常要部署一些原来系统里没有的字体,原先我为了图省事经常会要求用户手动安装字体文件,虽然Windows的易用性做得相当不错,但是仍然要照顾一些不会安装字体的人,其实把这些字体打包进安装包更为方便,不过我觉得总不能每有新字体都要搞个安装包那么麻烦吧。更重要的是仍然有人会问我字体怎么安装,以前清一色的Windows XP系统,我倒也方便,直接告知打开控制面板找到字体文件夹,把要安装的字体拖进去即可;现在有Windows 7还是Windows 8等各种版本Windows系统,对于安装字体这个小小操作我也开始分情况讨论了。

  使用VBScript脚本来实现这个功能。脚本的重点是采用Shell.ApplicationActiveX/COM对象实现复制到系统特殊文件夹下,实际上这个操作和用户手动复制到字体文件夹下一样,系统会自动为我们安装字体而不需要我们顾及注册表更新的问题,对于Vista及更高版本的系统来说,我参考了《The true ultimate font install for Windows 7 and XP vbs》的做法,使用.InvokeVerb("Install")直接调用字体文件对象的安装命令。

详细的代码如下(请复制的朋友手下留情,保留版权信息,谢谢):

'
' File Description : VBScript Windows Fonts Installer
'
' Copyright (c) 2016-2017 Cheney_Yang. All rights reserved.
'
' Author: Cheney_Yang
' This code is distributed under the BSD license
'
' Usage:
'    Drag Font files or folder to this script
'    or Double click this script file, It will install fonts on the current directory
'    or select font directory to install
' *** 请不要移除此版权信息 ***
'
Option ExplicitConst FONTS = &H14&
Const HKEY_LOCAL_MACHINE = &H80000002
Const strComputer = "." Const SHELL_MY_COMPUTER = &H11
Const SHELL_WINDOW_HANDLE = 0
Const SHELL_OPTIONS = 0
Function GetOpenDirectory(title)Dim ShlApp,ShlFdr,ShlFdrItemSet ShlApp = WSH.CreateObject("Shell.Application")Set ShlFdr = ShlApp.Namespace(SHELL_MY_COMPUTER)Set ShlFdrItem = ShlFdr.SelfGetOpenDirectory = ShlFdrItem.PathSet ShlFdrItem = NothingSet ShlFdr = NothingSet ShlFdr = ShlApp.BrowseForFolder _(SHELL_WINDOW_HANDLE, _title, _SHELL_OPTIONS, _GetOpenDirectory)If ShlFdr Is Nothing ThenGetOpenDirectory = ""ElseSet ShlFdrItem = ShlFdr.SelfGetOpenDirectory = ShlFdrItem.PathSet ShlFdrItem = NothingEnd IfSet ShlApp = Nothing
End FunctionFunction IsVista()IsVista = FalseDim objWMIService, colOperationSystems, objOperationSystemSet objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")Set colOperationSystems = objWMIService.ExecQuery ("Select * from Win32_OperatingSystem")For Each objOperationSystem In colOperationSystemsIf CInt(Left(objOperationSystem.Version, 1)) > 5 ThenIsVista = TrueExit FunctionEnd IfNextSet colOperationSystems = NothingSet objWMIService = Nothing
End FunctionClass FontInstallerPrivate objShellPrivate objFolderPrivate objRegistryPrivate strKeyPathPrivate objRegExpPrivate objFileSystemObjectPrivate objDictFontFilesPrivate objDictFontNamesPrivate pfnCallBackPrivate blnIsVistaPublic Property Get FileSystemObjectSet FileSystemObject = objFileSystemObjectEnd PropertyPublic Property Let CallBack(value)pfnCallBack = valueEnd PropertyPrivate Sub Class_Initialize()strKeyPath = "Software\Microsoft\Windows NT\CurrentVersion\Fonts"Set objShell = CreateObject("Shell.Application")Set objFileSystemObject = CreateObject("Scripting.FileSystemObject")Set objFolder = objShell.Namespace(FONTS)Set objDictFontFiles = CreateObject("Scripting.Dictionary")Set objDictFontNames = CreateObject("Scripting.Dictionary")Set objRegistry = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_ strComputer & "\root\default:StdRegProv")Set objRegExp = New RegExpobjRegExp.Global = FalseobjRegExp.Pattern = "^([^\(]+) \(.+$"blnIsVista = IsVista()makeFontNameListmakeFontFileListEnd SubPrivate Sub Class_Terminate()Set objRegExp = NothingSet objRegistry = NothingSet objFolder = NothingobjDictFontFiles.RemoveAllSet objDictFontFiles = NothingobjDictFontNames.RemoveAllSet objDictFontNames = NothingSet objFileSystemObject = NothingSet objShell = NothingEnd SubPrivate Function GetFilenameWithoutExtension(ByVal FileName)' http://social.technet.microsoft.com/Forums/en-US/ebe19301-541a-412b-8e89-08c4263cc60b/get-filename-without-extensionDim Result, iResult = FileNamei = InStrRev(FileName, ".")If ( i > 0 ) ThenResult = Mid(FileName, 1, i - 1)End IfGetFilenameWithoutExtension = ResultEnd FunctionPrivate Sub makeFontNameList()On Error Resume NextDim strValue,arrEntryNamesobjRegistry.EnumValues HKEY_LOCAL_MACHINE, strKeyPath, arrEntryNamesFor Each strValue in arrEntryNames objDictFontNames.Add objRegExp.Replace(strValue, "$1"), strValueNext If Err.Number<>0 Then Err.ClearEnd SubPrivate Sub makeFontFileList()On Error Resume NextDim objFolderItem,colItems,objItemSet objFolderItem = objFolder.Self'Wscript.Echo objFolderItem.PathSet colItems = objFolder.ItemsFor Each objItem in colItemsobjDictFontFiles.Add GetFilenameWithoutExtension(objItem.Name),objItem.NameNextSet colItems = NothingSet objFolderItem = NothingIf Err.Number<>0 Then Err.ClearEnd SubFunction getBaseName(ByVal strFileName)getBaseName = objFileSystemObject.GetBaseName(strFileName)End FunctionPublic Function PathAddBackslash(strFileName)PathAddBackslash = strFileNameIf objFileSystemObject.FolderExists(strFileName) ThenDim last' 文件夹存在' 截取最后一个字符last = Right(strFileName, 1)If last<>"\" And last<>"/" ThenPathAddBackslash = strFileName & "\"End IfEnd IfEnd FunctionPublic Function isFontInstalled(ByVal strName)isFontInstalled = objDictFontNames.Exists(strName) Or objDictFontFiles.Exists(strName)End FunctionPublic Function isFontFileInstalled(ByVal strFileName)isFontFileInstalled = isFontInstalled(objFileSystemObject.GetBaseName(strFileName))End FunctionPublic Sub installFromFile(ByVal strFileName)Dim strExtension, strBaseFileName, objCallBack, nResultstrBaseFileName = objFileSystemObject.GetBaseName(strFileName)strExtension = UCase(objFileSystemObject.GetExtensionName(strFileName))If Len(pfnCallBack) > 0 ThenSet objCallBack = GetRef(pfnCallBack)ElseSet objCallBack = NothingEnd IfIf strExtension = "TTF" Or strExtension = "TTC" Or strExtension = "OTF" ThenIf Not isFontInstalled(strBaseFileName) ThenIf blnIsVista ThenDim objFont, objFontNameSpaceSet objFontNameSpace = objShell.Namespace(objFileSystemObject.GetParentFolderName(strFileName))Set objFont = objFontNameSpace.ParseName(objFileSystemObject.GetFileName(strFileName))'WSH.Echo objFileSystemObject.GetParentFolderName(strFileName)objFont.InvokeVerb("Install")Set objFont = NothingSet objFontNameSpace = NothingElse'WSH.Echo strFileName
                objFolder.CopyHere strFileNameEnd IfnResult = 0ElsenResult = 1End IfElsenResult = -1End IfIf IsObject(objCallBack) ThenobjCallBack Me, strFileName, nResultSet objCallBack = NothingEnd IfEnd SubPublic Sub installFromDirectory(ByVal strDirName)Dim objFolder, colFiles, objFileSet objFolder = objFileSystemObject.GetFolder(strDirName)Set colFiles = objFolder.FilesFor Each objFile in colFilesIf objFile.Size > 0 TheninstallFromFile PathAddBackslash(strDirName) & objFile.NameEnd IfNextSet colFiles = NothingSet objFolder = NothingEnd SubPublic Sub setDragDrop(objArgs)' http://msdn.microsoft.com/en-us/library/c488f3e0(v=vs.84).aspxDim iFor i = 0 to objArgs.Count - 1If objFileSystemObject.FileExists(objArgs(i)) TheninstallFromFile objArgs(i)ElseIf objFileSystemObject.FolderExists(objArgs(i)) TheninstallFromDirectory objArgs(i)End IfNextEnd Sub
End ClassSub ForceCScriptExecution()' https://stackoverflow.com/questions/4692542/force-a-vbs-to-run-using-cscript-instead-of-wscript' http://www.winhelponline.com/articles/185/1/VBScripts-and-UAC-elevation.htmlDim Arg, StrIf Not LCase( Right( WScript.FullName, 12 ) ) = "\cscript.exe" ThenFor Each Arg In WScript.ArgumentsIf InStr( Arg, " " ) Then Arg = """" & Arg & """"Str = Str & " " & ArgNextIf IsVista() ThenCreateObject( "Shell.Application" ).ShellExecute _"cscript.exe","//nologo """ & _WScript.ScriptFullName & _""" " & Str, "", "runas", 1ElseCreateObject( "WScript.Shell" ).Run _"cscript //nologo """ & _WScript.ScriptFullName & _""" " & StrEnd IfWScript.QuitEnd If
End SubSub DisplayMessage(ByRef objInstaller, ByVal strFileName, ByVal nResult)WScript.StdOut.Write "Install " & objInstaller.getBaseName(strFileName) & " ->>> "Select Case nResultCase 0WScript.StdOut.Write "SUCCEEDED"Case 1WScript.StdOut.Write "ALREADY INSTALLED"Case -1WScript.StdOut.Write "FAILED (Reason: Not a Font File)"End SelectWScript.StdOut.Write vbCrLf
End SubSub Pause(strPause)WScript.Echo (strPause)WScript.StdIn.Read(1)
End SubFunction VBMain(colArguments)VBMain = 0ForceCScriptExecution()WSH.Echo "Easy Font Installer 1.0" & vbCrLf &_"Written By Cheney_Yang " & vbCrLf & vbCrLfDim objInstaller, objFso, objDictFontFilesSet objInstaller = New FontInstallerobjInstaller.CallBack = "DisplayMessage"If colArguments.Count > 0 ThenobjInstaller.setDragDrop colArgumentsElseSet objFso = objInstaller.FileSystemObjectSet objDictFontFiles = CreateObject("Scripting.Dictionary")Dim objFolder, colFiles, objFile, strDirName, strExtensionstrDirName = objFso.GetParentFolderName(WScript.ScriptFullName)Set objFolder = objFso.GetFolder(strDirName)Set colFiles = objFolder.FilesFor Each objFile in colFilesIf objFile.Size > 0 ThenstrExtension = UCase(objFso.GetExtensionName(objFile.Name))If strExtension = "TTF" Or strExtension = "TTC" Or strExtension = "OTF" ThenobjDictFontFiles.Add objFile.Name, objInstaller.PathAddBackslash(strDirName) & objFile.NameEnd IfEnd IfNextSet colFiles = NothingSet objFolder = NothingSet objFso = NothingIf objDictFontFiles.Count > 0 ThenIf MsgBox("Current Directory has " & objDictFontFiles.Count & " Font Files." & vbCrLf &_vbCrLf & "Click OK to continue install or Cancel to Select Directory", 1) = 1 ThenDim i, objItemsFor i = 0 To  objDictFontFiles.Count-1objItems = objDictFontFiles.ItemsobjInstaller.installFromFile objItems(i)NextElsestrDirName = GetOpenDirectory("Select Fonts Directory:")If strDirName<>"" ThenobjInstaller.installFromDirectory strDirNameElseWScript.Echo "----- Drag Font File To This Script -----"End IfEnd IfEnd IfobjDictFontFiles.RemoveAllSet objDictFontFiles = NothingEnd IfSet objInstaller = NothingPause vbCrLf & vbCrLf & "Press Enter to continue"
End FunctionWScript.Quit(VBMain(WScript.Arguments))

  这个脚本的使用方法很简单,将上述代码保存为VBS文件,然后将要安装的字体或者包含字体的文件夹拖放到这个脚本文件即可,还有个方法就是直接双击脚本,然后按照提示会自动安装与脚本同路径的字体文件或者提示选择字体所在路径以便于安装。

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

使用VBSCRIPT安装字体相关推荐

  1. 域环境users提权调用lsrunase.exe 批处理完成安装字体

    字体安装2.0 由于字体安装之前的批处理采用字体文件复制到c:\windows\fonts下再注册注册表的方式,一部分字体安装不上,重新修改了批处理方式. 一. 字体安装批处理 1.vbs脚本运行安装 ...

  2. LINUX CentOS7安装字体库

    LINUX CentOS7安装字体库 2017年12月26日 17:06:07 q260996583 阅读数:4866更多 个人分类: linux JAVA画图时常用到Font 类对象 这样的对象依赖 ...

  3. win10 安装字体且不占用系统盘资源

    作为一个21世纪的新青年,电脑里怎么阔以只有那些沉闷的老旧字体呢,快跟进安装blingbling个性飘逸的时尚字体吧! 如下:三步足矣~ 1. 首先在非系统盘建一个专门存字体的文件夹:将欲安装字体存进 ...

  4. 如何给CentOS安装字体库

    很多时候,我们需要做一些图像生成工作(譬如验证码之类的),这时候,我们一般都需要用到系统的字体库.但事情却总非尽善人意,我们所使用的Linux操作系统无法像Windows操作系统那样足够"旗 ...

  5. 转: Ubuntu 安装字体方法

    命令安装: 以微软雅黑字体为例(其他的宋体.黑体等点阵字体都一样的),我们的雅黑字体文件是:Yahei.ttf(放在自己的主目录下)(在widows目录的Fonts目录下找需要的字体) 由于我是双系统 ...

  6. cnpm 安装文件找不到_大师操作win7系统电脑软件中找不到已经安装字体的恢复步骤...

    大师操作win7系统电脑软件中找不到已经安装字体的恢复步骤 更新日期:2020-10-26 00:55:06作者:win7字体来源:本站整理 不知道大家有没有遇到过win7系统电脑软件中找不到已经安装 ...

  7. 如何自动化安装字体(命令行批量)

    之前只知道AddFontResourceEx安装字体,但昨天才发现这货只是在重启系统前有效,并没有真正安装到系统中,详见msdn. so,怎么才能批量安装字体呢?全选字体右键这种手工操作,虽然也比较方 ...

  8. linux 离线安装中文字库,centos7 离线安装字体fontconfig

    起因:最近做了个flowable然而linux下乱码,发现需要安装字体包 在线:直接 yum -y install fontconfig:yum -y install ttmkfdir:配置下即可. ...

  9. linux下字体怎么安装方法,linux安装字体方法

    1.查看系统中文字体 #fc-list :lang=zh 2.如果提示commont not fount 说明为安装fontconfig 3.安装fontconfig #yum -y install ...

  10. 一天一点linux(15):Ubuntu14.04 如何安装字体?

    Ubuntu安装字体 安装字体管理器,执行命令 sudo apt-get install font-manager 将喜欢字体复制到自己的ubuntu系统上,用字体管理器打开,双击字体,点击insta ...

最新文章

  1. ubuntu查看端口占用
  2. vs2010 vc nmake编译openssl-0.9.8e
  3. samtools常用命令详解
  4. zabbix mon监控mysql_MON-DB-mysql通过zabbix监控processlist数量
  5. JAVA 手撕底层arrayList代码(arrayList的简单实现)
  6. python set函数原理,Python之set详解
  7. 酒店客房管理系统任务汇报1
  8. keras提取模型中的某一层_Keras做图片分类(四):迁移学习--猫狗大战实战
  9. 程序MD5校验的作用
  10. java restsharp_RestSharp使用总结
  11. masm5安装教程_MASM使用方法及版本号
  12. 记蓝墨云班课APP逆向及利用
  13. 先试试这一招,再决定是否要撬开拉杆箱的密码锁——巧开密码锁
  14. seafile私有云盘搭建全过程记录
  15. excel从身份证号码中获取邮编信息?
  16. python数据分析实验报告_使用 Python 3 进行气象数据分析
  17. 银行排队信息预测系统数学建模
  18. 【IPAM】Netbox docker模式版本升级
  19. CMMI五大成熟度定义及过程管理类详解
  20. 原生微信小程序实现手写签名功能

热门文章

  1. 使用Py-OpenCV(SIFT关键点)实现自然图像中的logo商标识别和定位
  2. 自动伽马校正(Auto Gamma Correction)算法
  3. 视频流(自适应算法)
  4. SPSS学习笔记:神经网络
  5. ShuffleNet在Caffe框架下的实现
  6. 贴片电阻功率与尺寸对照表
  7. 股票自动交易软件的特点?
  8. 显卡RTX2080 + CUDA10 + win10 + tensorflow配置安装探坑记
  9. 臭氧9母带处理工具:iZotope Ozone 9 Advanced for Mac
  10. 开源GIS与空间数据库实战教程