ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Winhance代码实现解析:PowerShell脚本生成引擎是如何工作的完整指南

Winhance代码实现解析:PowerShell脚本生成引擎是如何工作的完整指南 Winhance代码实现解析PowerShell脚本生成引擎是如何工作的完整指南【免费下载链接】Winhance-zh_CNA Chinese version of Winhance. C# application designed to optimize and customize your Windows experience.项目地址: https://gitcode.com/gh_mirrors/wi/Winhance-zh_CNWinhance 是一款基于 C# 的 Windows 优化与定制工具它的核心能力之一就是自动生成 PowerShell 脚本来卸载预装应用、清理冗余功能并防止其重装。本文带你深入源码拆解这套 PowerShell 脚本生成引擎的设计思路与完整工作流程。为什么 Winhance 要生成脚本而不是直接执行很多系统优化工具在点击卸载时会立即执行命令而 Winhance 选择了一条更稳健的路先落盘、后执行把用户勾选的所有操作汇总成一个.ps1脚本文件保存到C:\Program Files\Winhance\Scripts\目录开机时自动运行通过 Windows 计划任务在系统启动时以 SYSTEM 权限执行脚本彻底移除新安装中可能重新出现的应用脚本可追溯用户随时可以打开BloatRemoval.ps1查看将被执行的内容透明且可手动修改这种生成脚本而非即时执行的设计也是 Winhance 与 UnattendedWinstall 思路一脉相承的地方——配置一次系统重启时自动生效。引擎全景6 个核心角色整套脚本生成引擎位于 ScriptGeneration/ 目录采用典型的职责分离 依赖注入架构共 6 个核心角色角色类名职责 模板提供器PowerShellScriptTemplateProvider提供各类 PowerShell 命令模板 脚本构建器PowerShellScriptBuilderService把模板和数据拼装成完整脚本文本 脚本工厂PowerShellScriptFactory生成结构化的RemovalScript对象✂️ 复合修改器CompositeScriptContentModifier从已有脚本中增删条目 脚本更新服务ScriptUpdateService维护已有BloatRemoval.ps1的内容⏰ 计划任务服务ScheduledTaskService注册开机自动执行的任务它们的接口定义集中在 Core 项目的 Interfaces/ 目录例如 IScriptBuilderService.cs 和 IScriptTemplateProvider.cs。实现与接口分离让上层业务代码完全不知道脚本具体是怎么拼出来的。第一步模板提供器准备零件PowerShellScriptTemplateProvider.cs 负责提供最底层的命令模板每个模板都是一个带占位符的字符串移除应用包Get-AppxPackage -Name {0} | Remove-AppxPackage ...第 28-33 行移除可选功能Get-WindowsCapability -Online | Where-Object ... | Remove-WindowsCapability -Online注册表操作值为空时生成reg delete否则生成reg add /t REG_DWORD ...第 49-59 行脚本头尾GetScriptHeader生成带时间戳的注释头GetScriptFooter写入一条关键命令——禁用 Windows 消费者功能云策略从根源上防止预装应用随系统更新回来模板模式的好处在于所有怎么写的知识都集中在这一个类里将来升级 Windows 版本导致命令变化时只需要修改这一处。第二步构建器把零件组装成完整脚本PowerShellScriptBuilderService.cs 是整个引擎的装配车间。它的核心方法BuildCompleteRemovalScript第 153-330 行做了四件事写脚本头调用模板提供器生成注释和生成时间合并应用包列表把主包和子包如 Copilot、Xbox 的附属包合并并用Distinct()去重生成$packages (...)数组按类型分段生成依次输出移除包、移除能力、禁用可选功能、注册表设置四个代码区块写脚本尾追加防止重装的策略命令和完成提示其中有两个很实用的细节注册表值类型转换GetRegTypeString把 C# 的RegistryValueKind映射成reg.exe认识的类型字符串如DWORD、SZFormatRegistryValue第 393-416 行则按类型决定是否给值加引号空值即删除注册表条目如果值为空会自动切换为reg delete删除模板一个字段同时表达了设置和删除两种语义第三步工厂产出可执行的 RemovalScript 对象PowerShellScriptFactory.cs 是面向上层的总装车间。CreateBatchRemovalScript第 38-72 行的返回值不是裸文本而是一个结构化的RemovalScript对象return new RemovalScript { Name BloatRemoval, Content scriptContent, TargetScheduledTaskName Winhance\\BloatRemoval, RunOnStartup true };它同时携带脚本内容、计划任务名、是否开机运行三项元信息后续保存和注册任务都基于这个对象进行。工厂里还有个巧妙的应用分类器CategorizeApps第 105-144 行用户只勾选了应用名工厂会查询应用目录WindowsAppCatalog把每个名字归类为标准包 / 可选能力 / 可选功能三种类型交给构建器生成对应的命令。查不到的名字默认按标准包处理保证脚本永远不会因为未知类型而漏掉条目。关键设计脚本不是一次性的而是活的这是引擎最有意思的部分。BloatRemoval.ps1会随着用户操作持续演进再次批量卸载时ScriptGenerationService.cs 会先检查脚本是否已存在——存在就走更新分支不存在才走新建分支当用户重新安装某个应用时UpdateBloatRemovalScriptForInstalledAppAsync第 293-488 行会反向操作把该应用从脚本的包数组里删掉否则开机会被脚本再次卸载从脚本里删条目由 CompositeScriptContentModifier.cs 实现它是个组合器把修改请求分发给四个专用修改器包 / 能力 / 功能 / 注册表。以 PackageScriptModifier.cs 为例它的做法是在脚本文本中定位$packages (起始位置找到数组结束符)截取整段数组逐行解析出包名移除目标条目重建数组文本把新数组替换回原文这种文本级差量更新避免了整体重建脚本可能破坏用户手动修改的问题同时也解释了为什么生成的脚本数组采用整齐的单行一个条目格式——方便机器解析。更新逻辑统一封装在 ScriptUpdateService.cs 中并通过isInstallOperation参数区分追加条目还是移除条目。最后一步计划任务让脚本开机自动生效脚本保存后ScheduledTaskService.cs 负责最后一公里。它的实现方式很务实不直接调用 COM API而是动态生成一段临时的 PowerShell 注册脚本第 85-122 行核心是这几行$action New-ScheduledTaskAction -Execute powershell.exe -Argument -ExecutionPolicy Bypass -File $scriptPath $trigger New-ScheduledTaskTrigger -AtStartup Register-ScheduledTask -TaskName $taskName -Action $action -Trigger $trigger -User SYSTEM -RunLevel Highest -Force注意三个关键点-AtStartup触发器系统启动时自动运行无需用户登录-User SYSTEM -RunLevel Highest以系统账户、最高权限执行确保Remove-AppxProvisionedPackage等需要管理员权限的命令能成功临时脚本用完即删注册脚本保存在%TEMP%执行完毕后自动清理不污染系统完整流程一图流把整条链路串起来一次批量卸载的旅程是用户在界面勾选应用 → ViewModel 收集勾选名单ScriptGenerationService检查BloatRemoval.ps1是否存在决定新建还是更新PowerShellScriptFactory把应用分类为包 / 能力 / 功能三类PowerShellScriptBuilderService按模板拼装出完整脚本文本SaveScriptAsync把脚本写入Program Files\Winhance\Scripts\BloatRemoval.ps1ScheduledTaskService注册Winhance\BloatRemoval计划任务下次开机时系统自动以 SYSTEM 权限执行脚本完成卸载并阻断重装架构亮点总结模板与数据彻底分离命令写法只在 PowerShellScriptTemplateProvider.cs 一处维护符合单一职责原则工厂模式产出对象而非文本RemovalScript携带任务名、开机标志等元数据让保存和任务注册解耦组合模式做差量修改CompositeScriptContentModifier聚合四个专用修改器新增脚本区域时只需新增一个修改器面向接口编程所有角色都先定义接口如 IScriptContentModifier.cs、IScriptFactory.csCore 项目引用接口、Infrastructure 项目提供实现项目边界清晰对于想学习 C# 工程化设计的读者src/Winhance.Infrastructure/Features/Common/ScriptGeneration/ 目录是一个非常值得研读的样本它展示了如何把一个生成文本文件这样看似简单的需求拆分成职责单一、可测试、易扩展的一组服务。【免费下载链接】Winhance-zh_CNA Chinese version of Winhance. C# application designed to optimize and customize your Windows experience.项目地址: https://gitcode.com/gh_mirrors/wi/Winhance-zh_CN创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表