发布于 

PowerShell 安装和删除字体

原理和机制

本质上来说,安装字体就是把字体复制到字体文件夹,在注册表里面添加对应的项就可以了,删除就是相反的操作。

右键字体的时候能看到有 安装为所有用户安装

这里拿 为所有用户安装 做演示,给用户安装的改改也差不多

更纱黑体 sarasa-gothic-ttc-0.40.0.7z 字体包

这里用了 更纱黑体 sarasa-gothic-ttc-0.40.0.7z 字体包做演示

为所有用户安装的字体是复制到 C:\Windows\Fonts 目录下面的。

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 位程序使用的,

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts

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\FontsHKEY_LOCAL_MACHINE\,这两个地方都需要管理员权限才能操作的。

当然你可以把项的值路径指向别的地方,从而避免操作 C:\Windows\Fonts,就像给用户安装字体的路径、允许使用快捷方式安装字体一样

用户安装字体的注册表路径

允许使用快捷方式安装字体

准备工作

这里我就简单说一下,

在安装字体前,先把对应的注册表路径下的内容导一份出来,例如 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts

安装完字体之后,再导出一份注册表出来,拿文本对比的工具来重复的字体项删除,把差异部分挑出来,存成注册表。

注册表内容对比

到时候就用脚本把字体复制进去对应的路径,把注册表导入进去就行了。

要注意的是,给 32 位程序用的 WOW6432Node 路径也要导入一份的,把上面得到注册表里面的内容复制一份改一下路径就行。

WOW6432Node

安装字体

文件结构

经过上面的准备,注册表导出完成了

假设字体和注册表放在 \\10.1.1.100\Install_Fonts\更纱黑体 这个共享路径里面,刚刚对比注册表差异得到的注册表名为 InstallFonts.reg

\\10.1.1.100\Install_Fonts\更纱黑体 InstallFonts.reg

安装脚本

1
2
3
4
5
6
7
8
9
10
11
# 安装字体.ps1

# 定义存放字体文件夹的路径和安装路径
$InstallFontsFolder = "\\10.1.1.100\Install_Fonts\更纱黑体"
$SystemFontFolder = "C:\Windows\Fonts"

# 从共享文件夹复制字体到目标目录
Copy-Item -Path "$InstallFontsFolder\*.*" -Destination $SystemFontFolder -Exclude "*.reg"

# 导入字体的安装注册表
Regedit /s "$InstallFontsFolder\InstallFonts.reg"

删除字体

修改得到用于删除的注册表文件

要删除字体的话,要对之前的注册表做一点修改。

复制一份 InstallFonts.reg 改名为 DeleteFonts.reg

然后把 DeleteFonts.reg 里面每一个项的值的内容改成 -,这样导入这个注册表就是删除这个项

DeleteFonts.reg

可以用正则表达式来批量替换

1
2
=".*"
=-

正则表达式来批量替换

文件结构

假设字体和注册表放在 \\10.1.1.100\Install_Fonts\更纱黑体 这个共享路径里面,用于删除的注册表名为 DeleteFonts.reg

\\10.1.1.100\Install_Fonts\更纱黑体 DeleteFonts.reg

删除脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 删除字体.ps1

# 定义存放字体文件夹的路径和安装路径
$InstallFontsFolder = "\\10.1.1.100\Install_Fonts\更纱黑体"
$SystemFontFolder = "C:\Windows\Fonts"

# 导入注册表(用于删除字体的注册表)
Regedit /s "$InstallFontsFolder\DeleteFonts.reg"

# 从安装目录那边获取字体的列表
$FontsNameList = Get-ChildItem -Path $InstallFontsFolder -Exclude "*.reg" | Select-Object -ExpandProperty Name

# 循环删除字体文件
foreach ($FontsName in $FontsNameList){
Remove-Item -Path $SystemFontFolder\$FontsName -Force
}

补充

有个问题是在字体文件占用的时候,删除会异常,我暂时没什么好办法解除占用,要手动装一次再删除之类的。

只能尽量让脚本运行在字体不会被占用的状态下,比如开机登陆的时候之类的的。

不过只要删除注册表能生效,字体删不掉影响不大。

也可以把字体文件放在别的目录下面,把注册表的值指向那个目录就行。


原文作者:tjxwork
原文链接:https://www.tjxblog.com/blog/2023-0004
发布时间:2023-02-06