PowerShell 安装和删除字体
原理和机制
本质上来说,安装字体就是把字体复制到字体文件夹,在注册表里面添加对应的项就可以了,删除就是相反的操作。
右键字体的时候能看到有 安装 和 为所有用户安装
这里拿 为所有用户安装 做演示,给用户安装的改改也差不多
为所有用户安装的字体是复制到 C:\Windows\Fonts
目录下面的。
64 位系统的话,安装完字体会写入两组注册表
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\Fonts
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts
两组注册表内容基本一样的,WOW6432Node
这个路径的,是给在 64 位系统上运行的 32 位程序使用的,
WOW6432Node
的相关信息可以看这里:受 WOW64 影响的注册表项 - Win32 apps | Microsoft Learn
用户安装字体的文件路径:
C:\Users\%USERNAME%\AppData\Local\Microsoft\Windows\Fonts
用户安装字体的注册表路径:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts
如果你要为所有用户安装字体,那就要操作
C:\Windows\Fonts
和HKEY_LOCAL_MACHINE\
,这两个地方都需要管理员权限才能操作的。当然你可以把项的值路径指向别的地方,从而避免操作
C:\Windows\Fonts
,就像给用户安装字体的路径、允许使用快捷方式安装字体一样
准备工作
这里我就简单说一下,
在安装字体前,先把对应的注册表路径下的内容导一份出来,例如 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts
安装完字体之后,再导出一份注册表出来,拿文本对比的工具来重复的字体项删除,把差异部分挑出来,存成注册表。
到时候就用脚本把字体复制进去对应的路径,把注册表导入进去就行了。
要注意的是,给 32 位程序用的 WOW6432Node
路径也要导入一份的,把上面得到注册表里面的内容复制一份改一下路径就行。
安装字体
文件结构
经过上面的准备,注册表导出完成了
假设字体和注册表放在 \\10.1.1.100\Install_Fonts\更纱黑体
这个共享路径里面,刚刚对比注册表差异得到的注册表名为 InstallFonts.reg
安装脚本
1 | # 安装字体.ps1 |
删除字体
修改得到用于删除的注册表文件
要删除字体的话,要对之前的注册表做一点修改。
复制一份 InstallFonts.reg
改名为 DeleteFonts.reg
然后把 DeleteFonts.reg
里面每一个项的值的内容改成 -
,这样导入这个注册表就是删除这个项
可以用正则表达式来批量替换
1 | =".*" |
文件结构
假设字体和注册表放在 \\10.1.1.100\Install_Fonts\更纱黑体
这个共享路径里面,用于删除的注册表名为 DeleteFonts.reg
删除脚本
1 | # 删除字体.ps1 |
补充
有个问题是在字体文件占用的时候,删除会异常,我暂时没什么好办法解除占用,要手动装一次再删除之类的。
只能尽量让脚本运行在字体不会被占用的状态下,比如开机登陆的时候之类的的。
不过只要删除注册表能生效,字体删不掉影响不大。
也可以把字体文件放在别的目录下面,把注册表的值指向那个目录就行。
原文作者:tjxwork
原文链接:https://www.tjxblog.com/blog/2023-0004
发布时间:2023-02-06