
🔥 个人主页: 杨利杰YJlio
❄️ 个人专栏: 《Windows 疑难杂症与工单复盘案例库》 《Sysinternals实战教程》
《WINDOWS教程》 《Windows PowerShell 实战》 《IOS插件分析测试》
🌟 让复杂的事情更简单,让重复的工作自动化



Windows 全局换鸿蒙字体:PE 与 FontLink 实战
- 一、操作目标与风险边界
- 二、先理解四种字体处理机制
- 三、准备字体目录与替换清单
- 四、两阶段执行流程
- [五、第一阶段:在 PE 中备份并替换字体](#五、第一阶段:在 PE 中备份并替换字体)
- 六、第二阶段:正常安装额外字体
- [七、FontLink 修复:只在字体名称完全匹配时执行](#七、FontLink 修复:只在字体名称完全匹配时执行)
- 八、是否替换等线字体
- 九、验证字体是否真正生效
- 十、常见问题与技术说明
-
- [10.1 为什么在 PE 中替换](#10.1 为什么在 PE 中替换)
- [10.2 为什么复制到 Fonts 后仍要安装](#10.2 为什么复制到 Fonts 后仍要安装)
- [10.3 为什么 FontLink 在部分应用中无效](#10.3 为什么 FontLink 在部分应用中无效)
- [10.4 系统更新会不会恢复默认字体](#10.4 系统更新会不会恢复默认字体)
- [10.5 缩放比例应该设置多少](#10.5 缩放比例应该设置多少)
- [10.6 能否把修改后的字体包分享给其他人](#10.6 能否把修改后的字体包分享给其他人)
- 十一、回退方案:先恢复文件,再恢复注册表
- 十二、处理总结

一、操作目标与风险边界
本文记录一套在测试环境中调整 Windows 系统字体的两阶段方案:先进入 Windows PE,离线替换已经预制好的系统字体文件;再回到 Windows,安装额外字重并调整 FontLink 字体链接。
目标字体为华为官方提供的 HarmonyOS Sans。实际部署时不能把官方下载的字体文件简单改名为 msyh.ttc、simsun.ttc 或其他系统文件名。TTF、TTC 和 OTF 是不同的字体容器,文件内部还包含字体家族、字重、样式和字符映射等元数据。只修改扩展名或外部文件名,不能改变字体内部结构。
本文中的"直接替换"目录必须存放已经完成格式、内部名称、字重和系统映射适配的预制字体文件。普通用户只有官方下载的 HarmonyOS Sans 字体时,更安全的做法是正常安装字体,并在浏览器、Office、编辑器或其他应用中单独选择,不要直接覆盖 Windows 系统字体。

| 风险项目 | 可能结果 |
|---|---|
| 字体文件与内部名称不匹配 | 字体无法加载、应用回退到其他字体或显示方框 |
| 字重映射错误 | 中文和英文粗细不一致,粗体或细体显示异常 |
| 系统字体文件缺失 | 登录界面、设置、资源管理器或第三方应用出现乱码 |
| Windows 更新或系统修复 | 自定义字体可能被系统原文件重新覆盖 |
| 企业终端策略 | 字体安装、脚本执行或注册表修改可能被安全策略拦截 |
| 字体授权与再分发 | 修改或分享重新打包后的字体前,需要核对字体包附带的许可条款 |
本教程不建议用于公司生产电脑、域控设备、业务主机或唯一的个人主力机。至少先在虚拟机或可回滚的测试机上验证,并准备完整系统镜像。

二、先理解四种字体处理机制
Windows 字体调整至少涉及字体安装、文件替换、字体链接和字体替代四种机制。它们的作用不同,不能混为一谈。
| 机制 | 位置或方式 | 主要作用 |
|---|---|---|
| 字体安装 | 设置 → 个性化 → 字体,或右键"为所有用户安装" |
把字体加入 Windows 可用字体表,供应用主动选择 |
| 系统字体文件替换 | 离线覆盖 %WINDIR%\Fonts 中的指定文件 |
改变系统原字体文件实际承载的字形,风险最高 |
FontLink |
HKLM\...\FontLink\SystemLink |
基础字体缺少某个字符时,使用链接字体补充字形 |
FontSubstitutes |
HKLM\...\FontSubstitutes |
把一个字体名称替换为另一个字体,微软建议仅作为最后手段 |
FontLink 不会覆盖基础字体已经存在的字符。例如 Segoe UI 自带拉丁字母,链接中文字体后,英文字母仍由 Segoe UI 显示;只有 Segoe UI 缢少的中文字符才会使用链接字体。微软还说明,FontLink 主要属于 GDI 机制,不同应用可能使用 DirectWrite、浏览器 CSS、WPF 或自己的字体回退规则,所以同一套注册表配置不会保证所有界面效果完全一致。
FontLink 更适合解决缺字与中英文回退,不是全局替换 Segoe UI 的开关。真正改变系统默认中文字体外观,通常仍依赖系统字体文件、应用字体选择和各自的渲染链路。

三、准备字体目录与替换清单
将全部文件整理到一个独立目录中。本例目录如下:
text
C:\Users\yjlio\Desktop\Fonts
├─ 直接替换
├─ 手动安装
├─ 01_PE替换字体.cmd
├─ 02_FontLink修复.cmd
└─ 字体映射说明.txt

直接替换 目录只放已经完成系统适配的字体文件。脚本会按文件名查找离线 Windows 中的同名文件,先备份,再覆盖。目录中出现的每一个文件都必须经过人工确认。
手动安装 目录用于保存额外字重或不需要覆盖系统原文件的字体。进入 Windows 后应选择"为所有用户安装",让系统完成字体注册。
建议在 字体映射说明.txt 中记录每个文件的来源和作用:
text
文件名 内部字体名称 用途
MSYHSB.TTC Microsoft YaHei UI Semibold Segoe UI Semibold 中文链接
MSYHSL.TTC Microsoft YaHei UI Semilight Segoe UI Semilight 中文链接
MSYHHV.TTC Microsoft YaHei UI Heavy Segoe UI Black 中文链接
Deng.ttf 已适配的等线常规字重 可选替换
Dengb.ttf 已适配的等线粗体 可选替换
Dengl.ttf 已适配的等线细体 可选替换
上表中的内部名称只是本次预制字体包使用的示例。官方下载的 HarmonyOS Sans 文件不会自动变成这些内部名称。FontLink 中填写的字体文件名和字体家族名必须与实际字体完全一致。
不要默认删除 simsunbd.ttf、simsunbd.ttc 或其他看起来像"宋体粗体"的文件。不同 Windows 版本和自定义字体包的文件名可能不同,只有映射清单明确要求并已经完成备份时才能处理。

四、两阶段执行流程
完整流程分为 PE 离线替换和 Windows 在线注册两个阶段。PE 阶段处理正在运行的 Windows 无法安全覆盖的字体文件;Windows 阶段负责额外字体安装、字体链接和最终验证。
#mermaid-svg-sCtZTPpcMST7rCPE{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-sCtZTPpcMST7rCPE .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-sCtZTPpcMST7rCPE .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-sCtZTPpcMST7rCPE .error-icon{fill:#552222;}#mermaid-svg-sCtZTPpcMST7rCPE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-sCtZTPpcMST7rCPE .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-sCtZTPpcMST7rCPE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-sCtZTPpcMST7rCPE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-sCtZTPpcMST7rCPE .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-sCtZTPpcMST7rCPE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-sCtZTPpcMST7rCPE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-sCtZTPpcMST7rCPE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-sCtZTPpcMST7rCPE .marker.cross{stroke:#333333;}#mermaid-svg-sCtZTPpcMST7rCPE svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-sCtZTPpcMST7rCPE p{margin:0;}#mermaid-svg-sCtZTPpcMST7rCPE .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-sCtZTPpcMST7rCPE .cluster-label text{fill:#333;}#mermaid-svg-sCtZTPpcMST7rCPE .cluster-label span{color:#333;}#mermaid-svg-sCtZTPpcMST7rCPE .cluster-label span p{background-color:transparent;}#mermaid-svg-sCtZTPpcMST7rCPE .label text,#mermaid-svg-sCtZTPpcMST7rCPE span{fill:#333;color:#333;}#mermaid-svg-sCtZTPpcMST7rCPE .node rect,#mermaid-svg-sCtZTPpcMST7rCPE .node circle,#mermaid-svg-sCtZTPpcMST7rCPE .node ellipse,#mermaid-svg-sCtZTPpcMST7rCPE .node polygon,#mermaid-svg-sCtZTPpcMST7rCPE .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-sCtZTPpcMST7rCPE .rough-node .label text,#mermaid-svg-sCtZTPpcMST7rCPE .node .label text,#mermaid-svg-sCtZTPpcMST7rCPE .image-shape .label,#mermaid-svg-sCtZTPpcMST7rCPE .icon-shape .label{text-anchor:middle;}#mermaid-svg-sCtZTPpcMST7rCPE .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-sCtZTPpcMST7rCPE .rough-node .label,#mermaid-svg-sCtZTPpcMST7rCPE .node .label,#mermaid-svg-sCtZTPpcMST7rCPE .image-shape .label,#mermaid-svg-sCtZTPpcMST7rCPE .icon-shape .label{text-align:center;}#mermaid-svg-sCtZTPpcMST7rCPE .node.clickable{cursor:pointer;}#mermaid-svg-sCtZTPpcMST7rCPE .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-sCtZTPpcMST7rCPE .arrowheadPath{fill:#333333;}#mermaid-svg-sCtZTPpcMST7rCPE .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-sCtZTPpcMST7rCPE .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-sCtZTPpcMST7rCPE .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sCtZTPpcMST7rCPE .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-sCtZTPpcMST7rCPE .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sCtZTPpcMST7rCPE .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-sCtZTPpcMST7rCPE .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-sCtZTPpcMST7rCPE .cluster text{fill:#333;}#mermaid-svg-sCtZTPpcMST7rCPE .cluster span{color:#333;}#mermaid-svg-sCtZTPpcMST7rCPE div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-sCtZTPpcMST7rCPE .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-sCtZTPpcMST7rCPE rect.text{fill:none;stroke-width:0;}#mermaid-svg-sCtZTPpcMST7rCPE .icon-shape,#mermaid-svg-sCtZTPpcMST7rCPE .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sCtZTPpcMST7rCPE .icon-shape p,#mermaid-svg-sCtZTPpcMST7rCPE .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-sCtZTPpcMST7rCPE .icon-shape .label rect,#mermaid-svg-sCtZTPpcMST7rCPE .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sCtZTPpcMST7rCPE .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-sCtZTPpcMST7rCPE .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-sCtZTPpcMST7rCPE :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
下载官方 HarmonyOS Sans 并核对许可
准备经过适配的系统字体文件
制作完整系统镜像和字体映射清单
进入 Windows PE
人工确认离线系统盘
备份字体文件和字体注册表
按直接替换目录覆盖同名文件
重启进入 Windows
为所有用户安装额外字体
核对字体文件名与内部家族名
备份并修改 FontLink
重启系统
分别验证 GDI、DirectWrite 和浏览器界面
是否稳定
保留备份并记录版本
进入 PE 恢复原字体和注册表
所有修改都应遵循"一次只改一组文件"的原则。一次覆盖全部系统字体并同时修改多组注册表,即使最终恢复正常,也无法确定是哪一步产生了作用;出现异常时也难以回退。

五、第一阶段:在 PE 中备份并替换字体
在 Windows PE 中,原系统盘符不一定是 C:。为避免脚本误判,本版脚本不自动选择系统盘,而是要求人工输入盘符,并检查离线注册表文件。
将以下内容保存为 01_PE替换字体.cmd,与 直接替换 文件夹放在同一目录:
bat
@echo off
chcp 65001 >nul
setlocal EnableExtensions EnableDelayedExpansion
echo.
echo ==========================================
echo Windows PE 系统字体备份与替换
echo ==========================================
echo.
set "ROOT=%~dp0"
set "DIRECT=%ROOT%直接替换"
if not exist "%DIRECT%\" (
echo [错误] 未找到目录:
echo %DIRECT%
pause
exit /b 1
)
echo 请先在 DiskPart 或资源管理器中确认离线 Windows 盘符。
echo 示例:如果离线系统目录是 D:\Windows,只输入 D
set /p "SYSDRV=请输入离线 Windows 盘符:"
set "SYSDRV=%SYSDRV::=%"
set "WINROOT=%SYSDRV%:\Windows"
set "FONTDIR=%WINROOT%\Fonts"
set "SOFTHIVE=%WINROOT%\System32\Config\SOFTWARE"
if not exist "%SOFTHIVE%" (
echo [错误] 目标不是有效的离线 Windows:
echo %WINROOT%
pause
exit /b 1
)
if not exist "%FONTDIR%\" (
echo [错误] 未找到字体目录:
echo %FONTDIR%
pause
exit /b 1
)
set "BAK=%ROOT%Backup_Fonts_%RANDOM%_%RANDOM%"
mkdir "%BAK%" >nul 2>nul
if not exist "%BAK%\" (
echo [错误] 无法创建备份目录。
pause
exit /b 1
)
echo.
echo 源目录:%DIRECT%
echo 目标目录:%FONTDIR%
echo 备份目录:%BAK%
echo.
echo [1/4] 备份离线字体注册表...
reg load HKLM\OFFLINE_FONT_SOFTWARE "%SOFTHIVE%" >nul 2>nul
if errorlevel 1 (
echo [警告] 离线 SOFTWARE 注册表加载失败。
echo 将继续备份字体文件,但不会生成注册表备份。
) else (
reg export "HKLM\OFFLINE_FONT_SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" "%BAK%\Fonts_Registry.reg" /y >nul
reg export "HKLM\OFFLINE_FONT_SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink" "%BAK%\FontLink_SystemLink.reg" /y >nul
reg export "HKLM\OFFLINE_FONT_SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes" "%BAK%\FontSubstitutes.reg" /y >nul
reg unload HKLM\OFFLINE_FONT_SOFTWARE >nul
echo 已导出字体相关注册表。
)
echo [2/4] 生成待替换文件列表...
(
echo 替换时间:%date% %time%
echo 离线系统:%WINROOT%
echo.
) > "%BAK%\ReplacedFiles.txt"
set /a COUNT=0
for %%E in (ttf ttc otf) do (
for %%F in ("%DIRECT%\*.%%E") do (
if exist "%%~fF" (
set /a COUNT+=1
echo %%~nxF>>"%BAK%\ReplacedFiles.txt"
)
)
)
if !COUNT! EQU 0 (
echo [错误] 直接替换目录中没有 TTF、TTC 或 OTF 文件。
pause
exit /b 1
)
echo.
echo 即将处理 !COUNT! 个字体文件。
type "%BAK%\ReplacedFiles.txt"
echo.
set /p "CONFIRM=确认目标盘和文件列表无误后输入 YES:"
if /I not "%CONFIRM%"=="YES" (
echo 已取消,没有复制字体文件。
pause
exit /b 2
)
echo [3/4] 备份原文件并覆盖同名字体...
for %%E in (ttf ttc otf) do (
for %%F in ("%DIRECT%\*.%%E") do (
if exist "%%~fF" (
if exist "%FONTDIR%\%%~nxF" (
copy /b /y "%FONTDIR%\%%~nxF" "%BAK%\%%~nxF" >nul
if errorlevel 1 (
echo [错误] 备份失败:%%~nxF
pause
exit /b 3
)
echo 已备份:%%~nxF
) else (
echo 原系统无同名文件:%%~nxF
)
copy /b /y "%%~fF" "%FONTDIR%\%%~nxF" >nul
if errorlevel 1 (
echo [错误] 替换失败:%%~nxF
pause
exit /b 4
) else (
echo 已写入:%%~nxF
)
)
)
)
echo [4/4] 完成。
echo.
echo 备份目录:
echo %BAK%
echo.
echo 请重启进入 Windows,安装"手动安装"目录字体,
echo 然后再执行 FontLink 修复。
pause
脚本只处理 直接替换 目录中明确存在的字体文件,不包含任何固定删除逻辑。原系统存在同名文件时会先备份;没有同名文件时,脚本会把它作为新增文件写入 Fonts 目录。
微软说明,字体文件复制到 %WINDIR%\Fonts 后,重启可以让字体进入系统字体表。但系统字体替换仍属于高风险自定义操作,脚本成功只代表文件复制成功,不代表字体结构、内部名称和应用兼容性已经通过验证。

六、第二阶段:正常安装额外字体
重启进入 Windows 后,打开 手动安装 文件夹,选择需要安装的字体,右键执行"为所有用户安装"。微软支持通过 Windows 字体管理界面或右键菜单安装 TTF 和 OTF 字体。
额外字体安装后,应在以下位置确认:
text
设置
个性化
字体
也可以打开:
text
C:\Windows\Fonts
需要同时检查字体家族和字重是否完整。例如 Regular、Light、Medium、Semibold、Bold、Black 是否都能被系统识别。只看到一个字体家族名称,不代表全部字重已经注册。
不要通过修改扩展名把 .ttf 伪装成 .ttc。TTC 是可以包含多个字体的集合文件,需要通过字体工具正确生成,不能通过文件重命名完成转换。
七、FontLink 修复:只在字体名称完全匹配时执行
FontLink 注册表位置为:
text
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink
下面脚本适用于本案例中已经预制为 MSYHSB.TTC、MSYHSL.TTC 和 MSYHHV.TTC,并且内部字体名称分别为 Microsoft YaHei UI Semibold、Microsoft YaHei UI Semilight 和 Microsoft YaHei UI Heavy 的字体包。
如果实际字体文件名或内部家族名不同,必须先修改脚本。官方 HarmonyOS Sans 原始文件通常不会使用这些 Microsoft YaHei UI 名称。
将以下内容保存为 02_FontLink修复.cmd,右键以管理员身份运行:
bat
@echo off
chcp 65001 >nul
setlocal EnableExtensions
echo.
echo ==========================================
echo FontLink 字体链接备份与修复
echo ==========================================
echo.
net session >nul 2>nul
if errorlevel 1 (
echo [错误] 请右键选择"以管理员身份运行"。
pause
exit /b 1
)
set "FONTDIR=%WINDIR%\Fonts"
set "KEY=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink"
set "BACKUP=%~dp0FontLink_Backup.reg"
for %%F in (MSYHSB.TTC MSYHSL.TTC MSYHHV.TTC) do (
if not exist "%FONTDIR%\%%F" (
echo [错误] 未找到字体文件:
echo %FONTDIR%\%%F
echo 请先确认字体文件名和内部字体名称。
pause
exit /b 2
)
)
echo [1/3] 导出 FontLink 备份...
reg export "%KEY%" "%BACKUP%" /y
if errorlevel 1 (
echo [错误] FontLink 注册表备份失败,已停止修改。
pause
exit /b 3
)
echo [2/3] 写入 Segoe UI 字重链接...
reg add "%KEY%" /v "Segoe UI Semibold" /t REG_MULTI_SZ /d "MSYHSB.TTC,Microsoft YaHei UI Semibold,128,96\0MSYHSB.TTC,Microsoft YaHei UI Semibold" /f /reg:64
reg add "%KEY%" /v "Segoe UI Semilight" /t REG_MULTI_SZ /d "MSYHSL.TTC,Microsoft YaHei UI Semilight,128,96\0MSYHSL.TTC,Microsoft YaHei UI Semilight" /f /reg:64
reg add "%KEY%" /v "Segoe UI Black" /t REG_MULTI_SZ /d "MSYHHV.TTC,Microsoft YaHei UI Heavy,128,96\0MSYHHV.TTC,Microsoft YaHei UI Heavy" /f /reg:64
reg add "%KEY%" /v "Segoe UI Variable Display Semibold" /t REG_MULTI_SZ /d "MSYHSB.TTC,Microsoft YaHei UI Semibold,128,96\0MSYHSB.TTC,Microsoft YaHei UI Semibold" /f /reg:64
reg add "%KEY%" /v "Segoe UI Variable Display Semilight" /t REG_MULTI_SZ /d "MSYHSL.TTC,Microsoft YaHei UI Semilight,128,96\0MSYHSL.TTC,Microsoft YaHei UI Semilight" /f /reg:64
reg add "%KEY%" /v "Segoe UI Variable Small Semibold" /t REG_MULTI_SZ /d "MSYHSB.TTC,Microsoft YaHei UI Semibold,128,96\0MSYHSB.TTC,Microsoft YaHei UI Semibold" /f /reg:64
reg add "%KEY%" /v "Segoe UI Variable Small Semilight" /t REG_MULTI_SZ /d "MSYHSL.TTC,Microsoft YaHei UI Semilight,128,96\0MSYHSL.TTC,Microsoft YaHei UI Semilight" /f /reg:64
reg add "%KEY%" /v "Segoe UI Variable Text Semibold" /t REG_MULTI_SZ /d "MSYHSB.TTC,Microsoft YaHei UI Semibold,128,96\0MSYHSB.TTC,Microsoft YaHei UI Semibold" /f /reg:64
reg add "%KEY%" /v "Segoe UI Variable Text Semilight" /t REG_MULTI_SZ /d "MSYHSL.TTC,Microsoft YaHei UI Semilight,128,96\0MSYHSL.TTC,Microsoft YaHei UI Semilight" /f /reg:64
if errorlevel 1 (
echo [错误] 注册表写入失败,请导入备份恢复。
pause
exit /b 4
)
echo [3/3] 完成。
echo 备份文件:
echo %BACKUP%
echo.
echo 请重启电脑后验证。
pause
REG_MULTI_SZ 用于保存多行字体链接。reg add 默认使用 \0 分隔多条数据。每个链接在脚本中写了两次:第一条包含 128,96 缩放参数,第二条不带缩放参数。微软说明,GDI 可以读取缩放参数,而 GDI+ 无法解析该参数,所以 Windows 预设链接中常同时保留带缩放和不带缩放的两条记录。
脚本只影响需要回退到中文字体的字形,不会把 Segoe UI 自带的英文字符改成鸿蒙字体。浏览器网页如果使用 CSS 或在线 Web Font,也可能完全不读取这组 FontLink。

八、是否替换等线字体
Windows 常见等线字体文件包括:
text
Deng.ttf
Dengb.ttf
Dengl.ttf
如果预制字体包中提供了与这三个文件名、内部字体名称和字重关系完全匹配的替换文件,可以放入 直接替换 目录,由 PE 脚本一并备份和覆盖。
需要保留 Windows 原等线字体时,不要把这三个文件放进 直接替换 目录。脚本按照目录内容执行,不会判断用户审美偏好。
| 选择 | 影响 |
|---|---|
| 替换等线 | 使用等线的 Office 文档和应用界面也可能改变外观 |
| 保留等线 | 只调整其他映射字体,减少文档排版变化 |
系统字体变化可能影响 Word、Excel 和 PowerPoint 文档的换行、分页和表格宽度。对有固定打印版式的业务文档,应在替换前后分别导出 PDF 对比。

九、验证字体是否真正生效
字体替换完成并重启后,应分别从字体文件、字体注册、系统界面和应用渲染四个层级验证。
| 验证层级 | 检查方法 |
|---|---|
| 文件层 | 确认 C:\Windows\Fonts 中目标文件存在,大小和哈希符合预制字体包 |
| 注册层 | 检查 Windows 字体页面和 FontLink\SystemLink 数据 |
| 系统界面 | 查看登录界面、资源管理器、设置、控制面板和记事本 |
| 应用层 | 测试 Office、浏览器、WPF 应用及使用 DirectWrite 的软件 |
| 排版层 | 对比 Word 文档分页、Excel 单元格、PDF 导出与打印效果 |
可以记录字体文件哈希,便于 Windows 更新后判断文件是否被替换:
powershell
Get-FileHash `
"$env:WINDIR\Fonts\MSYHSB.TTC",
"$env:WINDIR\Fonts\MSYHSL.TTC",
"$env:WINDIR\Fonts\MSYHHV.TTC" `
-Algorithm SHA256
验证 FontLink:
cmd
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink" /v "Segoe UI Semibold"

浏览器截图只能作为主观效果参考。网页可能通过 CSS 指定本地字体,也可能加载网站自己的 Web Font,不能仅凭一个网页截图证明 Windows 全局字体已经完成替换。
建议建立一组固定测试内容,包含中文、英文、数字、粗体、细体、特殊符号和生僻字,并在多个应用中截图对比。

十、常见问题与技术说明
10.1 为什么在 PE 中替换
永久安装的系统字体会被 Windows 会话加载,运行中的系统可能阻止修改或删除正在使用的字体文件。PE 中的离线 Windows 没有加载这些字体,更适合完成文件级备份和替换。
10.2 为什么复制到 Fonts 后仍要安装
微软说明,把字体复制到 %WINDIR%\Fonts 后,重启可以让字体进入系统字体表;通过字体管理界面或"为所有用户安装"则能完成正式安装并立即提供给应用。对额外字重而言,使用正常安装流程更容易写入正确注册信息。
10.3 为什么 FontLink 在部分应用中无效
FontLink 主要属于 GDI 字体链接机制。现代 Windows 应用还可能使用 DirectWrite、WPF、浏览器 CSS 或应用内置字体回退,因此同一条 FontLink 在不同软件中的效果可能不同。
10.4 系统更新会不会恢复默认字体
Windows 累积更新、功能更新、就地修复、DISM 和 SFC 可能重新部署系统组件或受保护文件,自定义字体可能被部分或全部恢复。每次重要更新后应重新核对字体哈希和界面显示。
10.5 缩放比例应该设置多少
缩放比例应按显示器尺寸、分辨率和观看距离选择。125% 可能适合部分设备,但不是字体替换的固定要求。验证字体时应在用户实际使用的缩放比例下进行。
10.6 能否把修改后的字体包分享给其他人
应从华为官方设计资源页面获取 HarmonyOS Sans,并阅读下载包中的授权说明。字体的个人使用、商用、修改、嵌入和再分发可能适用不同条件;不要因为字体可以下载,就自动推断修改后的系统字体包可以任意再分发。

十一、回退方案:先恢复文件,再恢复注册表
回退不能只依赖系统还原点。更可靠的做法是保留完整系统镜像、PE 字体备份目录和 FontLink 注册表备份。
| 异常情况 | 回退动作 |
|---|---|
| 系统仍能正常进入桌面 | 导入 FontLink_Backup.reg,重启后再检查字体 |
| 界面严重乱码但仍能运行命令 | 先导入注册表备份,再进入 PE 恢复字体文件 |
| 无法正常登录或系统界面不可用 | 从维护介质进入 PE,复制备份字体回离线 Fonts 目录 |
| 备份不完整或系统仍异常 | 恢复系统镜像,或使用安装介质执行修复安装 |
在 PE 中恢复文件时,先确认离线系统盘,再把 Backup_Fonts_* 中的原文件复制回 Windows\Fonts。备份目录中的 ReplacedFiles.txt 可以用于确认本次改动过哪些文件。
系统能够进入 Windows 后,恢复 FontLink:
cmd
reg import "D:\Fonts\FontLink_Backup.reg"
恢复完成后重启。如果系统文件仍然异常,可按微软建议先运行 DISM,再运行 SFC:
cmd
DISM /Online /Cleanup-Image /RestoreHealth
sfc /scannow
完整系统镜像是最可靠的回退方式。字体文件和注册表备份只能覆盖已知改动,不能保证恢复脚本以外的字体缓存、应用配置和系统更新状态。

十二、处理总结
Windows 全局字体调整不是普通的字体安装。它同时涉及系统字体文件、字体内部元数据、字体注册、GDI FontLink、应用字体回退和 Windows 更新维护。
本次方案保留了"PE 离线替换 + Windows 安装与 FontLink 修复"的两阶段结构,但增加了以下安全边界:
| 顺序 | 执行要求 |
|---|---|
| 1 | 只使用来源明确且许可允许的字体文件 |
| 2 | 系统字体必须经过格式和内部名称适配,不能只改文件名 |
| 3 | PE 中人工确认离线系统盘,替换前备份文件和注册表 |
| 4 | 不默认删除任何系统字体,只处理清单中明确列出的文件 |
| 5 | FontLink 仅用于缺字回退,并按实际文件名和内部字体名配置 |
| 6 | 分别验证系统界面、Office、浏览器和文档排版 |
| 7 | 保留系统镜像、原字体、注册表备份和文件哈希 |
这套方法适合在测试机、虚拟机或可回滚镜像中研究 Windows 字体链路。生产环境优先使用应用级字体设置,只有在充分验证和具备回退条件时,才考虑系统级替换。
官方参考:
- Microsoft:Windows 字体回退、FontLink 与 FontSubstitutes
- Microsoft:管理和安装 Windows 字体
- Microsoft:字体安装与删除机制
- Microsoft:reg add 命令与 REG_MULTI_SZ
- Microsoft:使用 DISM 与 SFC 修复系统文件
- HUAWEI Developers:HarmonyOS Sans 官方设计资源
