Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

前言

平时在浏览许多前辈们的博客时,总能看到有不少前辈们的站点角落有引人注目的看板娘。我就在想,「如果自己的博客也能有自己喜欢的角色来彰显个性就好了」。

相信许多朋友们都和我一样,也想给自己的博客加上喜欢的角色作为看板娘吧?

众所周知,许多带看板娘的博客,其看板娘基本都用的是 Live2D 模型和引擎。Live2D 引擎使用 2.5D 设计和建模,其最大的特色是只要对角色各部位进行设计和建模,导出模型在查看器或 Live2D 引擎就能让角色动起来,无需花费大量时间画每一帧[1]

为此,我们需要下载所需的 Live2D 引擎组件,进行添加 Live2D 看板娘,以及添加自定义 Live2D 看板娘角色(可选)。

所需条件

  • 你的博客项目已建立好(修改前建议备份
  • 熟悉 Node.js、NPM、Yarn、PNPM、Git、VS Code 等运行时、包管理器、软件的使用,且已安装
  • 丰富的认知和思考能力
  • 足够的电脑性能

准备工作

Note

以我的 Hexo 框架和 Butterfly 主题为例。

Caution

其他主题或框架的部分方法可能有不同,具体请参考对应的文档说明。

下载和引入所需组件

下载 Live2D 依赖组件

进入 这个 Live2D 依赖组件的 GitHub 仓库 找到该依赖。

在页面选择【Code】—【Download ZIP】进行下载。

将依赖解压到 你的工作目录\source\live2d-widget 目录,如果 source 下没有 live2d-widget 目录,解压时会自动创建。


Tip

你也可以在 Git Bash 或其他终端使用 git clone 命令来下载到本地。

1
2
3
git clone https://github.com/stevenjoezhang/live2d-widget
# 你也可以在链接后指定克隆的目录。
# git clone https://github.com/stevenjoezhang/live2d-widget folder/live2d-widget

引入 Live2D 依赖组件

在你的工作目录的根目录找到 _config.butterfly.yml 配置文件并打开。

Tip

推荐用 VS Code 打开你的工作目录,在左侧资源管理器中操作代码文件,使用更方便。

Note

对于同为 Hexo 框架的其他主题,主题配置文件一样为 _config.theme.yml 格式。例如,NexT 主题为 _config.next.yml

找到 inject 下的 bottom 字段,按照注释中的格式填入 autoload.js 所在路径。

1
2
3
4
5
6
7
8
# Inject
# Insert the code to head (before '</head>' tag) and the bottom (before '</body>' tag)
inject:
head:
# - <link rel="stylesheet" href="/xxx.css">
bottom:
# - <script src="xxxx"></script>
- <script src="/live2d-widget/dist/autoload.js"></script>

打开 source 里的 live2d-widget\autoload.js,修改 const live2d_path 字段参数为 /live2d-widget/dist/ 并保存。

1
2
3
4
// Recommended to use absolute path for live2d_path parameter
// live2d_path 参数建议使用绝对路径
const live2d_path = '/live2d-widget/dist/';
// const live2d_path = '/dist/';

【可选】优化模型显示效果

打开 source 里的 live2d-widget\autoload.js

由于手机屏幕尺寸有限,个人建议禁用手机端加载。将 if (screen.width < 768) return; 字段取消注释。

1
2
3
// If you are concerned about display issues on mobile devices, you can use screen.width to determine whether to load
// 如果担心手机上显示效果不佳,可以根据屏幕宽度来判断是否加载
if (screen.width < 768) return;

更多说明,请参考 仓库README.md 自述文件。

【可选】下载、解包、引入 Live2D 模型

Warning

使用模型前,请仔细阅读务必遵守相应的注意事项。对于因不当使用而产生的纠纷,本人概不负责。

Caution

并非所有模型都能 100% 兼容。

下载 Live2D 模型

在各类站点下载你想要的 Live2D 模型。推荐几个 GitHub 仓库:

【如果需要】导出 Live2DViewerEX 创意工坊模型

Caution

请确保 Steam 和 Live2DViewerEX 均已安装,并且 Steam 已经启动。

在 Steam 库找到 Live2DViewerEX,选择【启动】,在弹出的对话框中选择【启动 Live2DViewerEX】—【开始游戏】。

在任务栏找到 Live2DViewerEX 图标,双击打开界面,找到并单击右侧的【批量导出】按钮。


选择你所需导出的模型,完成后单击【确认】,找到所需导出的路径,单击【选择文件夹】。


稍后会自动打开所在文件夹。

解包

Note

建议使用 7-Zip 对在 Live2DViewerEX 导出的 *.wpk 包进行解压。

选中全部 *.wpk 包,右键单击选中的文件,在弹出的快捷菜单中选择【显示更多选项】—【7-Zip】——【解压到 “\*”】。


Tip

对于 Windows 10 及以下版本,或将 Windows 11 右键菜单的「更多选项」设为默认显示状态下,则在快捷菜单中选择【7-Zip】——【解压到 “\*”】。

解包从 7-Zip 提取的 LPK 模型

Note

推荐使用工具:oovm/live2d-unpacker

Releases 页找到对应平台版本,并解压到合适的目录。

进入工具解压的目录,运行根目录下的 lpk-unpack.exe

在程序界面单击【选择文件夹】,找到解压的各 LPK 模型共存的根目录,单击【选择文件夹】。


程序会自动搜索 LPK 模型,全选并选择【解压选中文件】。

如果解压成功,在各模型编号下找到 character 文件夹,内部会有 character-costume.model3.json 文件以打开 Live2D 模型。

将解压出的 Live2D 模型放至项目文件夹

Tip

为了便于区分,强烈建议将其中解压出的 character 文件夹重命名为角色的英文名。角色英文名可查阅相应 wiki。

你的工作目录\source\live2d-widget\dist 中新建一个 model 文件夹,将重命名好的已被解包的模型文件夹复制进去。

在配置文件中引入 Live2D 模型

你的工作目录\source\live2d-widget\dist 中找到 waifu-tips.json 文件并打开。

models 字段按标记语法填入模型信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
"models": [{
"name": "Furina",
"paths": ["/live2d-widget/dist/model/Furina/Furina.model3.json"],
"message": "站在你面前的,就是枫丹人人皆知的大明星——芙宁娜哦!"
}, {
"name": "HuTao",
"paths": ["/live2d-widget/dist/model/HuTao/character-costume.model3.json"],
"message": "唷,找本堂主有何贵干呀?嗯?你不知道吗,往生堂第七十七代堂主就是我胡桃啦!"
}, {
"name": "HuTao2",
"paths": ["/live2d-widget/dist/model/HuTao2/character-costume.model3.json"],
"message": "唷,找本堂主有何贵干呀?嗯?你不知道吗,往生堂第七十七代堂主就是我胡桃啦!"
}, {
"name": "Elysia",
"paths": ["/live2d-widget/dist/model/Elysia/character-costume.model3.json"],
"message": "你已知晓了我的过去,作为交换,我想见证你的「未来」。"
}, {
"name": "Firefly",
"paths": ["/live2d-widget/dist/model/Firefly/character-costume.model3.json"],
"message": "嗨,又见面啦……我的意思,很高兴见到你。和往常一样,叫我「流萤」吧。"
}, {
"name": "Cyrene",
"paths": ["/live2d-widget/dist/model/Cyrene/character-costume.model3.json"],
"message": "这是命运的邂逅吗,还是……久别重逢呢?真让人心跳加速呀,那……就像初遇时那样,再一次呼唤我「昔涟」,好吗?"
}, {
"name": "Potion-Maker/Pio",
"paths": ["https://fastly.jsdelivr.net/gh/fghrsh/live2d_api/model/Potion-Maker/Pio/index.json"],
"message": "来自 Potion Maker 的 Pio 酱 ~"
}, {
"name": "Potion-Maker/Tia",
"paths": ["https://fastly.jsdelivr.net/gh/fghrsh/live2d_api/model/Potion-Maker/Tia/index.json"],
"message": "来自 Potion Maker 的 Tia 酱 ~"
}, {
"name": "HyperdimensionNeptunia",
"paths": [
"https://fastly.jsdelivr.net/gh/fghrsh/live2d_api/model/HyperdimensionNeptunia/neptune_classic/index.json",
"https://fastly.jsdelivr.net/gh/fghrsh/live2d_api/model/HyperdimensionNeptunia/nepnep/index.json",
"https://fastly.jsdelivr.net/gh/fghrsh/live2d_api/model/HyperdimensionNeptunia/neptune_santa/index.json",
"https://fastly.jsdelivr.net/gh/fghrsh/live2d_api/model/HyperdimensionNeptunia/nepmaid/index.json",
"https://fastly.jsdelivr.net/gh/fghrsh/live2d_api/model/HyperdimensionNeptunia/nepswim/index.json",
"https://fastly.jsdelivr.net/gh/fghrsh/live2d_api/model/HyperdimensionNeptunia/noir_classic/index.json",
"https://fastly.jsdelivr.net/gh/fghrsh/live2d_api/model/HyperdimensionNeptunia/noir/index.json",
"https://fastly.jsdelivr.net/gh/fghrsh/live2d_api/model/HyperdimensionNeptunia/noir_santa/index.json",
"https://fastly.jsdelivr.net/gh/fghrsh/live2d_api/model/HyperdimensionNeptunia/noireswim/index.json",
"https://fastly.jsdelivr.net/gh/fghrsh/live2d_api/model/HyperdimensionNeptunia/blanc_classic/index.json",
"https://fastly.jsdelivr.net/gh/fghrsh/live2d_api/model/HyperdimensionNeptunia/blanc_normal/index.json",
"https://fastly.jsdelivr.net/gh/fghrsh/live2d_api/model/HyperdimensionNeptunia/blanc_swimwear/index.json",
"https://fastly.jsdelivr.net/gh/fghrsh/live2d_api/model/HyperdimensionNeptunia/vert_classic/index.json",
"https://fastly.jsdelivr.net/gh/fghrsh/live2d_api/model/HyperdimensionNeptunia/vert_normal/index.json",
"https://fastly.jsdelivr.net/gh/fghrsh/live2d_api/model/HyperdimensionNeptunia/vert_swimwear/index.json",
"https://fastly.jsdelivr.net/gh/fghrsh/live2d_api/model/HyperdimensionNeptunia/nepgear/index.json",
"https://fastly.jsdelivr.net/gh/fghrsh/live2d_api/model/HyperdimensionNeptunia/nepgear_extra/index.json",
"https://fastly.jsdelivr.net/gh/fghrsh/live2d_api/model/HyperdimensionNeptunia/nepgearswim/index.json",
"https://fastly.jsdelivr.net/gh/fghrsh/live2d_api/model/HyperdimensionNeptunia/histoire/index.json",
"https://fastly.jsdelivr.net/gh/fghrsh/live2d_api/model/HyperdimensionNeptunia/histoirenohover"
],
"message": "Nep! Nep! 超次元游戏:海王星 系列"
}, {
"name": "Hiyori",
"paths": ["https://fastly.jsdelivr.net/gh/Live2D/CubismWebSamples/Samples/Resources/Hiyori/Hiyori.model3.json"],
"message": "是 Hiyori 哦 ~"
}]

字段解释:

字段名称 字段说明 参数值规范
"name" 角色名,用英文描述 "character",,使用英文半角逗号分隔
"paths" *.json 模型配置文件路径 使用中括号包围,如有多个则使用英文半角逗号分隔。对于网络路径,直接填写链接;对于本地路径,填写所在绝对路径,例如 /live2d-widget/dist/model/characters/config.model3.json
"message" 切换角色时的消息 "角色的台词",根据自己喜好或对应 wiki 填入即可,如有多个则使用英文半角逗号进行分隔
Note

最后四个为原本自带的网络 Live2D 模型。
加载顺序和 waifu-tips.json 中的顺序一致。

填写完成后,保存 waifu-tips.json 文件。

测试效果

开启 VS Code 的终端,执行命令开启预览。

1
2
hexo clean && hexo server
# 或者直接使用 hexo server

待终端出现 localhost 地址后,按住 Ctrl 并单击打开链接查看预览。

如果没有问题,关闭页面,回到 VS Code 的终端,按 Ctrl-C 停止预览服务器。

在服务器上部署(例如 GitHub Pages、Netlify、Vercel)

此步略。

题外话

  • 展示 Live2D 模型需要一定的性能,尽量使用高性能独显。如果你的笔记本电脑有独显,建议你在设置中将浏览器使用显卡设置为「高性能」,避免集显性能不足导致的卡顿。
  • 最好控制模型体积,尽量不选特效太丰富的模型。

参考资料和注释


  1. Live2D - 维基百科,自由的百科全书. https://zh.wikipedia.org/wiki/Live2D ↩︎

Tip

理论上其他华硕机型也适用本方法。

今天又遇到了在今年 5 月份遇到的 相同问题,只不过上次更新核显驱动的解决方案已不奏效。

进入【ARMOURY CRATE】,在侧边栏选择【设备】找到【你的机型】。


进入系统设置,确保显示模式为非独显模式,并断开电源。

关闭【上佳屏幕亮度】。此时接上电源也不受影响。

统一中文文案、排版的相关用法,降低团队成员之间的沟通成本,增强网站气质。


空格

「有研究显示,打字的时候不喜欢在中文和英文之间加空格的人,感情路都走得很辛苦,有七成的比例会在 34 岁的时候跟自己不爱的人结婚,而其余三成的人最后只能把遗产留给自己的猫。毕竟爱情跟书写都需要适时地留白。

与大家共勉之。」——vinta/paranoid-auto-spacing

中英文之间需要增加空格

正确:

在 LeanCloud 上,数据存储是围绕 AVObject 进行的。

错误:

在LeanCloud上,数据存储是围绕AVObject进行的。

在 LeanCloud上,数据存储是围绕AVObject 进行的。

完整的正确用法:

在 LeanCloud 上,数据存储是围绕 AVObject 进行的。每个 AVObject 都包含了与 JSON 兼容的 key-value 对应的数据。数据是 schema-free 的,你不需要在每个 AVObject 上提前指定存在哪些键,只要直接设定对应的 key-value 即可。

例外:「豆瓣FM」等产品名词,按照官方所定义的格式书写。

中文与数字之间需要增加空格

正确:

今天出去买菜花了 5000 元。

错误:

今天出去买菜花了 5000元。

今天出去买菜花了5000元。

数字与单位之间需要增加空格

正确:

我家的光纤入屋宽带有 10 Gbps,SSD 一共有 20 TB

错误:

我家的光纤入屋宽带有 10Gbps,SSD 一共有 20TB

例外:度数/百分比与数字之间不需要增加空格:

正确:

角度为 90° 的角,就是直角。

新 MacBook Pro 有 15% 的 CPU 性能提升。

错误:

角度为 90 ° 的角,就是直角。

新 MacBook Pro 有 15 % 的 CPU 性能提升。

全角标点与其他字符之间不加空格

正确:

刚刚买了一部 iPhone,好开心!

错误:

刚刚买了一部 iPhone ,好开心!

刚刚买了一部 iPhone, 好开心!

text-spacing 来挽救?

CSS Text Module Level 4 的 text-spacing 和 Microsoft 的 -ms-text-autospace 可以实现自动为中英文之间增加空白。不过目前并未普及,另外在其他应用场景,例如 macOS、iOS、Windows 等用户界面目前并不存在这个特性,所以请继续保持随手加空格的习惯。

标点符号

不重复使用标点符号

虽然中国大陆的标点符号用法允许重复使用标点符号,但是这么做会破坏句子的美观性。

正确:

德国队竟然战胜了巴西队!

她竟然对你说「喵」?!

错误:

德国队竟然战胜了巴西队!!

德国队竟然战胜了巴西队!!!!!!!!

她竟然对你说「喵」??!!

她竟然对你说「喵」?!?!??!!

全角和半角

不明白什么是全角(全形)与半角(半形)符号?请查看维基百科条目『全角和半角』。

使用全角中文标点

正确:

嗨!你知道嘛?今天前台的小妹跟我说「喵」了哎!

核磁共振成像(NMRI)是什么原理都不知道?JFGI!

错误:

嗨! 你知道嘛? 今天前台的小妹跟我说 “喵” 了哎!

嗨!你知道嘛?今天前台的小妹跟我说"喵"了哎!

核磁共振成像 (NMRI) 是什么原理都不知道? JFGI!

核磁共振成像(NMRI)是什么原理都不知道?JFGI!

例外:中文句子内夹有英文书籍名、报刊名时,不应借用中文书名号,应以英文斜体表示。

数字使用半角字符

正确:

这个蛋糕只卖 1000 元。

错误:

这个蛋糕只卖 1000 元。

例外:在设计稿、宣传海报中如出现极少量数字的情形时,为方便文字对齐,是可以使用全角数字的。

遇到完整的英文整句、特殊名词,其内容使用半角标点

正确:

乔布斯那句话是怎么说的?「Stay hungry, stay foolish.」

推荐你阅读 Hackers & Painters: Big Ideas from the Computer Age,非常地有趣。

错误:

乔布斯那句话是怎么说的?「Stay hungry,stay foolish。」

推荐你阅读《Hackers&Painters:Big Ideas from the Computer Age》,非常的有趣。

名词

专有名词使用正确的大小写

大小写相关用法原属于英文书写范畴,不属于本 wiki 讨论内容,在这里只对部分易错用法进行简述。

正确:

使用 GitHub 登录

我们的客户有 GitHub、Foursquare、Microsoft Corporation、Google、Facebook, Inc.。

错误:

使用 github 登录

使用 GITHUB 登录

使用 Github 登录

使用 gitHub 登录

使用 gイんĤЦ8 登录

我们的客户有 github、foursquare、microsoft corporation、google、facebook, inc.。

我们的客户有 GITHUB、FOURSQUARE、MICROSOFT CORPORATION、GOOGLE、FACEBOOK, INC.。

我们的客户有 Github、FourSquare、MicroSoft Corporation、Google、FaceBook, Inc.。

我们的客户有 gitHub、fourSquare、microSoft Corporation、google、faceBook, Inc.。

我们的客户有 gイんĤЦ8、キouЯƧquムгє、๓เςг๏ร๏Ŧt ς๏гק๏гคtเ๏ภn、900913、ƒ4ᄃëв๏๏к, IПᄃ.。

注意:当网页中需要配合整体视觉风格而出现全部大写/小写的情形,HTML 中请使用标淮的大小写规范进行书写;并通过 text-transform: uppercase;text-transform: lowercase; 对表现形式进行定义。

不要使用不地道的缩写

正确:

我们需要一位熟悉 TypeScript、HTML5,至少理解一种框架(如 React、Next.js)的前端开发者。

错误:

我们需要一位熟悉 Ts、h5,至少理解一种框架(如 RJS、nextjs)的 FED。

争议

以下用法略带有个人色彩,即:无论是否遵循下述规则,从语法的角度来讲都是正确的。

链接之间增加空格

用法:

提交一个 issue 并分配给相关同事。

访问我们网站的最新动态,请 点击这里 进行订阅!

对比用法:

提交一个 issue并分配给相关同事。

访问我们网站的最新动态,请点击这里进行订阅!

简体中文使用直角引号

用法:

「老师,『有条不紊』的『紊』是什么意思?」

对比用法:

“老师,‘有条不紊’的‘紊’是什么意思?”

工具

仓库 系列 语言
pangu.js pangu JavaScript
pangu-go pangu Go
pangu.java pangu Java
pangu.py pangu Python
pangu.rb pangu Ruby
pangu.php pangu PHP
pangu.vim pangu Vim
vue-pangu pangu Vue.js (Web Converter)
intellij-pangu pangu Intellij Platform Plugin
autocorrect autocorrect Rust, WASM, CLI tool
autocorrect-node autocorrect Node.js
autocorrect-py autocorrect Python
autocorrect-rb autocorrect Ruby
autocorrect-java autocorrect Java
autocorrect-go autocorrect Go
autocorrect-php autocorrect PHP
autocorrect-vscode autocorrect VS Code Extension
autocorrect-idea-plugin autocorrect Intellij Platform Plugin
jxlwqq/chinese-typesetting other PHP
sparanoid/space-lover other PHP (WordPress)
sparanoid/grunt-auto-spacing other Node.js (Grunt)
hjiang/scripts/add-space-between-latin-and-cjk other Python
hustcc/hint other Python
n0vad3v/Tekorrect other Python

谁在这样做?

网站 文案 UGC
Apple 中国 N/A
Apple 香港 N/A
Apple 台湾 N/A
Microsoft 中国 N/A
Microsoft 香港 N/A
Microsoft 台湾 N/A
LeanCloud N/A
V2EX
Apple4us N/A
Ruby China
少数派 N/A

参考文献

Forks

衍生项目的用法可能与本项目存在差异。

前言

博客从今年 6 月份建立至今,已经有 5 个多月了。在给博客折腾,优化得更好、更有个性的这段时间,我发现我有了不少收获。

不只是熟悉了注册 GitHub 在上面发布自己的项目,还熟悉了非常好用的 VS Code[1] 代码编辑器,以及如何用 Git 远程管理 GitHub 项目仓库、Markdown 扩展语法、部分 HTML/CSS 语法。

为什么要建立自己的博客?

平常在用 GoogleBing 搜索引擎查资料、解决问题的方法时,总能发现不少博主有自己的博客网页,他们的网页都做得很华丽,而且在 GitHub 托管项目和在 GitHub Pages 部署静态网页很方便。我就在想「如果我也能有自己的博客就好了」,于是就有了自己折腾博客的想法。

自己有自己的博客感觉很酷。能自己写博文和管理博客,再加上能折腾变得更有个性,想想就很开心!

在生活和实践中,免不了遇上一些困难,我不仅会利用 GoogleBing 等搜索引擎和 DeepSeekChatGPT 等生成 AI 查找,还会结合自己的经验和想法去解决问题。如果能有自己的博客,将我自己的经验记录下来,或许能帮上遇上同问题的朋友们。

不只是写自己的经验,还有自己想说的话也会写。

虽然如今互联网早已普及,SNS 平台也是一片红海,但我还是觉得个人博客网站依然不能少。

建立博客有什么好处?

  • 自己写想写的博文,在自己搭建的博客里管理更方便,基本没有大多数 SNS 平台被卡审核之类的问题
  • 自由度高,可玩性强。加上评论系统互动显得更有活力。
  • 在折腾的过程中能有不少收获,增长见识和经验,获得情绪价值。

具体有什么收获?

依赖组件和标记语言

  • Node.js 和 NPM、PNPM、Yarn 等包管理器Hexo 博客的搭建、测试、页面生成离不开这些依赖组件。简单了解了如何通过对应命令安装、更新、卸载组件。
  • Git:管理 GitHub 仓库必不可少的依赖。有了这个组件,对于管理在 GitHub 上托管的项目很方便,结合 VS Code[1:1] 的图形界面则更加方便。同时,Git 还自带了 Bash 终端,对我来说比 CMD 更舒服。
  • VS Code[1:2]:非常好用的代码编辑器,不止支持 Markdown、YAML、HTML、CSS、JavaScript 等常见语法,还带了 Git 和终端功能,且可以更改默认终端(我就改成了 Git Bash)和打开文件夹,用起来更方便,不用频繁切窗口。
  • Markdown:上手速度极快的标记语法。只要几分钟就能轻松上手,且易读性好。
  • HTML:在之前部署 docsify[2] 加入组件的时候,我又学到了一些 HTML 语法,以及 HTML 存在许多起始和结束标签,和引入 CSS、JavaScript 样式。
  • CSS/JavaScript:在 HexoButterfly 主题和 docsify 修改字体和自定义样式、插件的时候,这俩必不可少。
  • YAMLHexoButterfly、GitHub Actions 都在用的配置文件类型,易读性好。

定制界面和各种组件

  • Hexo:框架强大,生态(主题、插件、用户量)丰富,可玩性强。但自带的 hexo-marked 渲染器支持的扩展语法不多,换成 hexo-renderer-markdown-it-plus 加上用 NPM 安装好的所需插件就好。
  • Butterfly 主题:自带组件丰富,整体风格美观,适合许多不同喜好的人群;可玩性强,不仅自带了 font-awesome v6 图标,引入自定义字体样式、阿里 iconfont 自定义图标也很方便。
  • Waline 评论系统:支持不登录评论、Markdown 语法,以及在不同平台部署服务端和数据库端,支持各种通知方式。目前在用这个评论系统。
  • Gitalk:基于 GitHub Issues,界面美观,但要求权限比较高,且博主未打开文章界面创建 Issues 时,其他人均无法评论
  • Giscus:基于 GitHub Discussions,不需要博主打开文章创建话题,但界面没那么美观
  • LeanCloud:用于存放 Waline 各种信息的数据库。
  • Netlify:部署静态网页的服务,可从 GitHub 导入。其最大特点是可以不自定义域名直连,因此服务端就在这上面部署。

感想

自己折腾好博客,在 GitHub Pages 上部署好了之后,只要有链接和互联网,何时何地都能打开。这给了我很大的成就感。

可以在家人、朋友、同学面前炫耀,让他们小小羡慕一下,收获一点情绪价值。

今后还会不定期更新博文,不会停下。不白浪费这份成就。


  1. 全称 Visual Studio Code,和 Visual Studio 并非一类软件。 ↩︎ ↩︎ ↩︎

  2. 另一个文档生成器,其最大特点是只需要一个 index.html 就可以瞬间生成 Markdown 文档网页。 ↩︎

前言

最近在研究一件事——就是把下载好的字体文件放入 /source/fonts/ 文件夹中,如何通过撰写 CSS 样式文件来引入?

相信不少人都像我一样,想让自己的博客页面更有自己的个性,于是选择了生态丰富的 Hexo 框架和相对好看的 Butterfly 主题。但是,在构建过程中,难免会遇到一些麻烦。

准备工作

以我下载好的多字重 MiSans 字体和 Google Fonts 的 Noto Sans[1]/Serif[2] SC/TC/HK/JP/KR、Roboto、Roboto Slab、Roboto Mono 在线字体为例。

下载 MiSans 字体

先在 /source/ 里创建 fonts 文件夹,把所需 *.woff*.woff2 格式字体复制进去。

MiSans

导入 Google Fonts

进入 Google Fonts 官网

搜索上述字体,对所有字体都选择右上角的【Get font】加入购物车。

单击页面右上角的购物车按钮,选择右侧的【Get embed code】。

在 Web 栏中选择 @import 单选框,在第一个代码框中将 <style></style> 内的链接复制出来。

1
@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+HK:[email protected]&family=Noto+Sans+JP:[email protected]&family=Noto+Sans+KR:[email protected]&family=Noto+Sans+SC:[email protected]&family=Noto+Sans+TC:[email protected]&family=Noto+Serif+HK:[email protected]&family=Noto+Serif+JP:[email protected]&family=Noto+Serif+KR:[email protected]&family=Noto+Serif+SC:[email protected]&family=Noto+Serif+TC:[email protected]&family=Roboto+Mono:ital,wght@0,100..700;1,100..700&family=Roboto+Slab:[email protected]&family=Roboto:ital,wght@0,100..900;1,100..900&display=swap")

正式开始

创建 CSS 样式文件

用 VS Code 创建一个 CSS 样式文件,保存在 /source/css/ 下。 下面以 fonts.css 文件名为例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+HK:[email protected]&family=Noto+Sans+JP:[email protected]&family=Noto+Sans+KR:[email protected]&family=Noto+Sans+SC:[email protected]&family=Noto+Sans+TC:[email protected]&family=Noto+Serif+HK:[email protected]&family=Noto+Serif+JP:[email protected]&family=Noto+Serif+KR:[email protected]&family=Noto+Serif+SC:[email protected]&family=Noto+Serif+TC:[email protected]&family=Roboto+Mono:ital,wght@0,100..700;1,100..700&family=Roboto+Slab:[email protected]&family=Roboto:ital,wght@0,100..900;1,100..900&display=swap");

@font-face {
font-family: "MiSans";
font-display: swap;
font-weight: 100;
font-style: normal;
src: local("MiSans-Thin"),
url("../fonts/MiSans-Thin.woff2") format("woff2"),
url("../fonts/MiSans-Thin.woff") format("woff");
}

@font-face {
font-family: "MiSans";
font-display: swap;
font-weight: 200;
font-style: normal;
src: local("MiSans-ExtraLight"),
url("../fonts/MiSans-ExtraLight.woff2") format("woff2"),
url("../fonts/MiSans-ExtraLight.woff") format("woff");
}

@font-face {
font-family: "MiSans";
font-display: swap;
font-weight: 300;
font-style: normal;
src: local("MiSans-Light"),
url("../fonts/MiSans-Light.woff2") format("woff2"),
url("../fonts/MiSans-Light.woff") format("woff");
}

@font-face {
font-family: "MiSans";
font-display: swap;
font-weight: 400;
font-style: normal;
src: local("MiSans-Normal"), local("MiSans"),
url("../fonts/MiSans-Normal.woff2") format("woff2"),
url("../fonts/MiSans-Normal.woff") format("woff");
}

@font-face {
font-family: "MiSans";
font-display: swap;
font-weight: 500;
font-style: normal;
src: local("MiSans-Medium"),
url("../fonts/MiSans-Medium.woff2") format("woff2"),
url("../fonts/MiSans-Medium.woff") format("woff");
}

@font-face {
font-family: "MiSans";
font-display: swap;
font-weight: 600;
font-style: normal;
src: local("MiSans-SemiBold"),
url("../fonts/MiSans-SemiBold.woff2") format("woff2"),
url("../fonts/MiSans-SemiBold.woff") format("woff");
}

@font-face {
font-family: "MiSans";
font-display: swap;
font-weight: 700;
font-style: normal;
src: local("MiSans-Bold"),
url("../fonts/MiSans-Bold.woff2") format("woff2"),
url("../fonts/MiSans-Bold.woff") format("woff");
}

@font-face {
font-family: "MiSans";
font-display: swap;
font-weight: 800;
font-style: normal;
src: local("MiSans-Heavy"),
url("../fonts/MiSans-Heavy.woff2") format("woff2"),
url("../fonts/MiSans-Heavy.woff") format("woff");
}

@font-face {
font-family: "MiSans";
font-display: swap;
font-weight: 900;
font-style: normal;
src: local("MiSans-Demibold"),
url("../fonts/MiSans-Demibold.woff2") format("woff2"),
url("../fonts/MiSans-Demibold.woff") format("woff");
}

引入 CSS 样式文件

在项目根目录找到 _config.butterfly.yml 文件并打开,找到 inject 注释开头的那行,如下所示。

1
2
3
4
5
6
7
# Inject
# Insert the code to head (before '</head>' tag) and the bottom (before '</body>' tag)
inject:
head:
# - <link rel="stylesheet" href="/xxx.css">
bottom:
# - <script src="xxxx"></script>

head 处输入 <link rel="stylesheet" href="/css/fonts.css>

1
2
3
4
5
6
7
8
# Inject
# Insert the code to head (before '</head>' tag) and the bottom (before '</body>' tag)
inject:
head:
# - <link rel="stylesheet" href="/xxx.css">
- <link rel="stylesheet" href="/css/fonts.css>
bottom:
# - <script src="xxxx"></script>

修改字体样式

在项目根目录找到 _config.butterfly.yml 文件并打开,找到 Global font settings 注释开头的那行,如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
# Global font settings
# Don't modify the following settings unless you know how they work
font:
global_font_size:
code_font_size:
font_family:
code_font_family:

# Font settings for the site title and site subtitle
blog_title_font:
font_link:
font_family:

将参数设为如下值。

1
2
3
4
5
6
7
8
9
10
11
12
# Global font settings
# Don't modify the following settings unless you know how they work
font:
global_font_size: 16px
code_font_size: 12px
font_family: MiSans, Roboto, "Noto Sans SC", "PingFang SC", -apple-system, "Microsoft Yahei", "WenQuanYi Micro Hei", "ST Heiti", "Noto Sans TC", "PingFang TC", "Microsoft Jhenghei", "Noto Sans HK", "Noto Sans JP", Hiragino, Osaka, "Yu Gothic", Meiryo, "MS Mincho", "Noto Sans KR", "Apple Gothic", Seoul, "Malgun Gothic", Dotum, sans-serif, "Roboto Slab", "Noto Serif SC", SimSun, "Noto Serif TC", MingLiu, "Noto Serif HK", "Noto Serif JP", "Yu Mincho", "MS Mincho", "Noto Serif KR", "PC Myungjo", "Shin Myungjo Neue", Batang, serif, "Inter", 'Quicksand', 'Nimbus Roman No9 L', ui-sans-serif, system-ui, sans-serif, "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"
code_font_family: Consolas, "Roboto Mono", "Monaco", "Andale Mono", "Ubuntu Mono", monospace

# Font settings for the site title and site subtitle
blog_title_font:
font_link:
font_family: MiSans, Roboto, "Noto Sans SC", "PingFang SC", -apple-system, "Microsoft Yahei", "WenQuanYi Micro Hei", "ST Heiti", "Noto Sans TC", "PingFang TC", "Microsoft Jhenghei", "Noto Sans HK", "Noto Sans JP", Hiragino, Osaka, "Yu Gothic", Meiryo, "MS Mincho", "Noto Sans KR", "Apple Gothic", Seoul, "Malgun Gothic", Dotum, sans-serif, "Roboto Slab", "Noto Serif SC", SimSun, "Noto Serif TC", MingLiu, "Noto Serif HK", "Noto Serif JP", "Yu Mincho", "MS Mincho", "Noto Serif KR", "PC Myungjo", "Shin Myungjo Neue", Batang, serif, "Inter", 'Quicksand', 'Nimbus Roman No9 L', ui-sans-serif, system-ui, sans-serif, "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
Note

备用字体根据自行需求填写。

Tip

建议多填备用字体,以避免部分字符显示不出的问题。

保存配置文件。

测试样式是否生效

在项目根目录的终端中输入 hexo server 命令并执行,待出现 localhost:4000 时,进浏览器开启链接,查看样式是否生效。

如生效,则可关闭该标签页,在终端中按 Ctrl-C 终止执行。

在服务器部署

此步略。

注意事项

  • 不要在字体样式的 CSS 文件中加入 body 项,否则 _config.butterfly.yml 配置文件的字体样式会失效,且会牵连主题原本自带的 font-awesome v6 图标导致不显示!

题外话

如何一次性引用多个自定义 CSS 样式?

我个人建议将多个 CSS 样式配置只写进一个文件里,这样不容易出现奇怪的问题。

例如将透明样式引入 CSS,只需在行末加入以下内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.layout_post>#post {
background: rgba(255,255,255,.75);
}

#aside_content .card-widget, #recent-posts>.recent-post-item, .layout_page>div:first-child:not(.recent-posts), .layout_post>#page, .layout_post>#post, .read-mode .layout_post>#post{
background: rgba(255,255,255,.75);
}

:root {
--card-bg: rgba(255, 255, 255, .75);
}

#footer {
background: rgba(255,255,255, .0);
}
Caution

注意要和原本的样式间隔一行。

参考资料


  1. 中文:思源黑体,日文:源ノ角ゴシック,韩文:본고딕(本고딕),英文别名:Source Han Sans ↩︎

  2. 中文:思源宋体,日文:源ノ明朝,韩文:본명조(本明朝),英文别名:Source Han Serif ↩︎

如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
title: My Favorite HoYo Characters
# 我喜欢的米游角色

Honkai Impact 3rd: # 崩坏 3rd
- Kiana Kaslana # 琪亚娜·卡斯兰娜
- Raiden Mei # 雷电芽衣
- Theresa Apocalypse # 德丽莎·阿波卡利斯
- Bronya Zaychik # 布洛妮娅·扎伊切克
- Elysia # 爱莉希雅

Genshin Impact: # 原神
Mondstadt: # 蒙德
- Klee # 可莉
- Venti # 温迪
Liyue: # 璃月
- Hu Tao # 胡桃
- Ganyu # 甘雨
- Shenhe # 申鹤
- Zhongli # 钟离
- Xianyun # 闲云
- Xiangling # 香菱
- Lan Yan # 蓝砚
- Yanfei # 烟绯
- Chongyun # 重云
- Yaoyao # 瑶瑶
Inazuma: # 稻妻
- Yoimiya # 宵宫
- Raiden Shogun # 雷电将军
- Kamisato Ayaka # 神里绫华
- Sangonomiya Kokomi # 珊瑚宫心海
- Kaedehara Kazuha # 枫原万叶
- Arataki Itto # 荒泷一斗
- Kirara # 绮良良
Sumeru: # 须弥
- Nahida # 纳西妲
- Nilou # 妮露
Fontaine: # 枫丹
- Furina # 芙宁娜
- Navia # 娜维娅
- Sigewinne # 希格雯
- Escoffier # 爱可菲
- Charlotte # 夏洛蒂
Natlan: # 纳塔
- Mualani # 玛拉妮
- Mavuika # 玛薇卡
- Xilonen # 希诺宁
- Chasca # 恰斯卡
- Citlali # 茜特菈莉
- Varesa # 瓦雷莎
- Kachina # 卡齐娜
Nod-Krai: # 挪德卡莱
- Lauma # 菈乌玛
- Ineffa # 伊涅芙
- Nefer # 奈芙尔

"Honkai: Star Rail": # 崩坏:星穹铁道
Astral: # 星穹列车
- March 7th # 三月七
Stellaron Hunters: # 星核猎手
- Silver Wolf # 银狼
- Kafka # 卡芙卡
- Firefly # 流萤
Galaxy Rangers: # 巡海游侠
- Acheron # 黄泉
- Boothill # 波提欧
- Rappa # 乱破
Herta Space Station: # 「黑塔」空间站
- The Herta # 大黑塔
- Ruan Mei # 阮·梅
Jarilo-VI/Belobog: # 雅利洛-VI/贝洛伯格
- Seele # 希儿
- Hook # 虎克
- Clara # 克拉拉
The Xianzhou Luofu: # 「仙舟」罗浮
- Fu Xuan # 符玄
- Jing Yuan # 景元
- Huohuo # 藿藿
- Yunli # 云璃
- Bailu # 白露
Penacony: # 匹诺康尼
- Robin # 知更鸟
- Sparkle # 花火
Amphoreus: # 翁法罗斯
- Castorice # 遐蝶
- Tribble # 缇宝
- Aglaea # 阿格莱雅
- Hyacine # 风堇
- Cipher # 赛飞儿
- Cerydra # 克律德菈
- Evernight # 长夜月
- Cyrene # 昔涟

Zenless Zone Zero: # 绝区零
Cunning Hares: # 狡兔屋
- Nekomiya Mana # 猫宫又奈/猫又
- Anby Demara # 安比·德玛拉
Belobog Heavy Industries: # 白祇重工
- Grace Howard # 格莉斯·霍华德
- Koleda Belobog # 珂蕾妲·贝洛伯格
- Anton Ivanov # 安东·伊万诺夫
Victoria Housekeeping Co.: # 维多利亚家政
- Ellen Joe # 艾莲·乔
Obol Squad: # 防卫军·奥波勒斯小队
- Seed # 席德
Criminal Investigation Special Response Team: # 刑侦特勤组
- Zhu Yuan # 朱鸢
- Qingyi # 青衣
Sons of Calydon: # 卡吕冬之子
- Caesar King # 凯撒·金
- Burnice White # 柏妮思·怀特
Hollow Special Operations Section: # 对空六课
- Hoshimi Miyabi # 星见雅
- Tsukishiro Yanagi # 月城柳
- Asaba Harumasa # 浅羽悠真
Stars of Lyra: # 天琴座
- Astra Yao # 耀佳音
Defense Force - Silver Squad: # 防卫军·白银小队
- Soldier 0 - Anby # 零号·安比
Mockingbird: # 反舌鸟
- Vivian Banshee # 薇薇安·班希
Yunkui Summit: # 云岿山
- Yixuan # 仪玄
- Ju Fufu # 橘福福
Spook Shack: # 怪啖屋
- Ukinami Yuzuha # 浮波柚叶
- Alice Thymefield # 爱丽丝·泰姆菲尔德
- Lucia Elowen # 卢西娅·艾洛温

# "Honkai: Nexus Anima": # 崩坏:因缘精灵

Caution

本文针对的是 Windows 8 (NT 6.2, build 9200),并非 Windows 8.1 (NT 6.3, build 9600)!

前言

众所周知,微软官方并不像现在的 Windows 10/11 那样提供带更新的镜像(LTSB/LTSC 除外)。而我们直接安装目标系统,在目标系统里安装更新补丁很费时且麻烦,还有失败的可能。

微软早在 2016 年 1 月 12 日就已停止对 Windows 8 的支持,而同为 NT 6.2 内核的 Windows Embedded 8 直到 2023 年 7 月 11 日才停止 ESU 支持,Windows Server 2012 则是在 2026 年 10 月停止 ESU 支持。但同为 NT 6.2 内核的 Windows Server 2012 只有 64 位而没 32 位,因此 32 位的 Windows 8 和 Windows Embedded 8 的更新补丁只能安装到 2023 年 7 月 11 日,而 64 位 Windows 8、Windows Embedded 8 和 Windows Server 2012 则可以在 2026 年 10 月之内继续安装更新。

为此,我们就要挂载镜像,为 Windows 8 离线安装更新补丁和 BypassESU。


所需内容


正文

解压 ISO

  • 使用 7-Zip 或者其他解压缩软件将 ISO 解压到合适的目录。
  • 最好选择【解压到 \*】选项。

启用 .NET Framework 3.5 和安装 WE8 SKU 补丁

  • 启动 Dism++,在主界面选择【文件】—【挂载映像】,填入 WIM 文件路径和挂载目录。
Caution

注意挂载目录要先创建,不能是根目录、有文件的目录、非半角英文数字字符目录!


启用 .NET Framework 3.5

  1. 打开会话,选择【程序和功能】—【Windows 功能】,查看是否有本地源。
  2. 如有则双击【.NET Framework 3.5 (包括 .NET 2.0 和 3.0)】复选框,将其变成填充状态以启用 .NET Framework 3.5。
  3. 选择【应用】,等待一段时间后就启用了。
Note

保险起见,最好先保存映像,避免因后续失败而花大量时间重做。

安装 WE8 SKU、IE 11、.NET 4 更新补丁

Warning

注意一定要按照安装顺序进行,否则会出现「不适合」的现象而无法安装!

  1. 解压 Windows 8 安装 IE 11 和 .NET 4 先决更新补丁,里面有 x64x86 文件夹,分别代表 64 位和 32 位,根据镜像位宽选择即可。以下以 64 位为例。
  2. 在 Dism++ 选择【更新管理】—【Windows Update】—【添加】,找到先决更新补丁所在位置,进入 x64 文件夹,先选中以 Microsoft-Windows-Embedded-SKU 开头的全部 MUM 文件,然后单击【打开】安装 SKU 更新,等待一段时间。


  3. 重复上一个步骤,选中 Microsoft-Windows-Embedded-IE-Desktop-Package~31bf3856ad364e35~amd64~~6.2.9200.16384.mumMicrosoft-Windows-Embedded-NetFx4Extended-Package~31bf3856ad364e35~amd64~~6.2.9200.16384.mum 和以 Microsoft-Windows-Embedded-NetFx4 开头的更新补丁,单击【打开】安装 SKU 更新,等待一段时间。

Note

保险起见,最好先保存映像,避免因后续失败而花大量时间重做。

安装 IE 11 和 .NET 4.8

安装 IE 11

  1. 重复上述安装步骤,找到 IE 11 及语言包更新补丁所在位置,先选择 ie11-win6.2_8d823347334b5cb35a0d174a4267e03a8ae8ccc0.msu 打开安装 IE 11,等待一段时间。
  2. 然后选择 ie11-windows6.2-languagepack-x64-*.msu 语言包更新补丁,安装 IE 11 语言包,等待一段时间。
Note

保险起见,最好先保存映像,避免因后续失败而花大量时间重做。

安装 .NET Framework 4.8

  1. 解压安装器,将 .NET Framework 4.8 及语言包更新补丁放在和 .NET Framework 4 安装器同一个目录。
  2. 右键单击 NET48.cmd,在弹出的快捷菜单中选择【以管理员身份运行】。
  3. 输入所在的 WIM 挂载路径,按 Enter 执行安装。
  4. 在 Dism++ 保存映像,然后卸载。
Note

保险起见,最好先保存映像,避免因后续失败而花大量时间重做。

使用 BypassESU-Blue-v2 安装 ESU 破解补丁

  1. 解压 BypassESU-Blue-v2.7z 压缩包,找到所在位置,右键单击 Wim-Integration.cmd,在弹出的快捷菜单中选择【以管理员身份运行】。
  2. 输入 WIM 映像所在路径,按 Enter 进入下一步。
  3. 等待检测,按 <2> 进行安装。

使用 WSUS Offline Update 下载更新补丁

  1. 解压 WSUS Offline 压缩包,右键单击 UpdateGenerator.exe,选择【以管理员身份运行】。
  2. 选择 [Legacy products],在 [Windows 8 / Server 2012] 处勾选 [x64 Global],Option 处按照截图勾选。
  3. 单击 [Start] 开始下载更新补丁。等待一段时间。
Note

更新补丁下载在程序目录的 cilent\w62-x64\glb 处。

使用 NTLite 安装更新补丁

  1. 打开 NTLite,将 WIM 拖进窗口,双击分卷挂载 WIM。
  2. 找到补丁的下载位置,选中除 ie11-*.cabwindows8-rt-kb2966827-x64_6d16009f8bdb735822cfb385d3ecf2c7b74a567a.cab 外的所有更新补丁包,将其拖入 NTLite 的【更新整合】处,等待分析一段时间。

  3. 完成后,选择【结束】下的【应用】,再单击【工具栏】选项卡下的【开始】,确认应用更改。
Note

更新补丁安装需要等待一段时间。

Warning

一定不要安装 KB2966827 更新补丁,否则 .NET Framework 3.5 会被关闭,且无法再启用!


在虚拟机或实体机安装测试

  • 此步略。





Caution

微软对 Windows 8 安装 IE 11 和 .NET 4 设置阻碍的说明

  • 在 Windows 8 上,无法直接安装 IE 11 和 .NET 4,在未安装 SKU 先决更新补丁的情况下均会报错。而同为 NT 6.2 内核的 Windows Embedded 8 和 Windows Server 2012 则不受影响。
  • 就算装上 SKU 先决更新补丁,从微软官网下载的 .NET 4 安装包运行后也会报错。因此需要用 Windows Update 的更新补丁包进行安装。

参考资料

使用注意

以下命令均要以管理员身份在 cmdPowerShell 中运行。

Windows 8 (NT 6.2, build 9200)

对于 Windows 8,微软官方尚未提供镜像,因此需要用命令行转换 SKU。

Note

必须用 Retail 零售版镜像的专业版,不能用 VL 批量授权版镜像。VL 批量授权版不支持添加 Windows 功能!

首先要挂载目标镜像,输入以下命令(也可使用 Dism++ 挂载):

1
2
dism /Mount-Image /ImageFile:X:\xxx\xxx.wim /Index:x /MountDir:X:\xxxx
:: 「X」处需自行替换成自己镜像的对应目录。

挂载完后,执行 dism /Image:X:\xxxx /Get-TargetEditions 命令,获取目标 SKU。

1
2
dism /Image:X:\xxxx /Get-TargetEditions
:: 「X」处需自行替换成自己镜像的对应目录。

然后执行 dism /Image:X:\xxxx /Set-TargetEdition:ProfessionalWMC 命令,将专业版转换为带 WMC 的专业版。

1
2
dism /Image:X:\xxxx /Set-TargetEdition:ProfessionalWMC
:: 「X」处需自行替换成自己镜像的对应目录。

最后别忘记保存并卸载镜像,完成操作。

Dism++ 则要先保存(选择【直接保存】)后再卸载。

1
2
dism /Unmount-Image /MountDir:X:\xxxx /commit
:: 「X」处需自行替换成自己镜像的对应目录。最后的 /commit 保存更改命令不要遗漏。

Windows 8.1 (NT 6.3, build 9600)

Note

必须用 Retail 零售版镜像的专业版,不能用 VL 批量授权版镜像。VL 批量授权版不支持添加 Windows 功能!

首先要挂载目标镜像,输入以下命令(也可使用 Dism++ 挂载):

1
2
dism /Mount-Image /ImageFile:X:\xxx\xxx.wim /Index:x /MountDir:X:\xxxx
:: 「X」处需自行替换成自己镜像的对应目录。

挂载完后,执行 dism /Image:X:\xxxx /Get-TargetEditions 命令,获取目标 SKU。

1
2
dism /Image:X:\xxxx /Get-TargetEditions
:: 「X」处需自行替换成自己镜像的对应目录。

然后执行 dism /Image:X:\xxxx /Set-TargetEdition:ProfessionalWMC 命令,将专业版转换为带 WMC 的专业版。

1
2
dism /Image:X:\xxxx /Set-TargetEdition:ProfessionalWMC
:: 「X」处需自行替换成自己镜像的对应目录。

最后别忘记保存并卸载镜像,完成操作。

Dism++ 则要先保存(选择【直接保存】)后再卸载。

1
2
dism /Unmount-Image /MountDir:X:\xxx /commit
:: 「X」处需自行替换成自己镜像的对应目录。最后的 /commit 保存更改命令不要遗漏。

Windows 10 IoT 企业版 LTSC 2021、Windows 11 IoT 企业版 LTSC 2024 及以后版本

  • 对于 LTSC 2021 及以上版本,非 IoT 版仅有 5 年支持,而 IoT 版有 10 年支持。
  • 无需转换 SKU 的版本仅有英文镜像。

首先要挂载目标镜像,输入以下命令(也可使用 Dism++ 挂载):

1
2
dism /Mount-Image /ImageFile:X:\xxx\xxx.wim /Index:x /MountDir:X:\xxxx
:: 「X」处需自行替换成自己镜像的对应目录。

挂载完后,执行 dism /Image:X:\xxxx /Get-TargetEditions 命令,获取目标 SKU。

1
2
dism /Image:X:\xxxx /Get-TargetEditions
:: 「X」处需自行替换成自己镜像的对应目录。

然后执行 dism /Image:X:\xxxx /Set-TargetEdition:IoTEnterpriseS 命令,转换为带 IoT 的 LTSC 版。

1
2
dism /Image:X:\xxxx /Set-TargetEdition:IoTEnterpriseS
:: 「X」处需自行替换成自己镜像的对应目录。

最后别忘记保存并卸载镜像,完成操作。

Note

Dism++ 则要先保存(选择【直接保存】)后再卸载。

Note

该内容与 Windows 8 (NT 6.2, build 9200) 相关,并非 Windows 8.1 (NT 6.3, build 9600)。

最近,在折腾 Windows 8 (NT 6.2, build 9200) 系统的续命补丁和 IE 11 的安装,这些整体还是很顺利。
但最近遇到了一个棘手的事情,那就是在系统里用 Dism++,在开了【加载 WofAdk 驱动】的情况下优化和清理,重启后就会卡修复。


经过排查和日志信息,发现是 wofadk.sys 驱动的版本太高而未能正常加载。将其替换成 10.0.14393.x 及以下版本即可解决。


0%