tiny11builder模块化设计:如何为脚本添加自定义组件移除规则
tiny11builder是一个用于构建精简版Windows 11镜像的工具集,通过移除不必要的组件和应用程序来减小系统体积并提升性能。项目核心脚本tiny11maker.ps1和tiny11Coremaker.ps1采用了模块化设计,允许用户根据需求自定义组件移除规则。本文将详细介绍如何扩展这些脚本以添加自定义的组件移除规则。
了解现有组件移除机制
tiny11builder通过DISM(部署映像服务和管理工具)命令行工具来管理Windows映像中的组件。在tiny11maker.ps1中,主要通过以下两种方式移除组件:
- 预安装应用包(Provisioned Appx Packages)移除:通过
Remove-ProvisionedAppxPackage命令移除Windows预装应用 - 系统组件包(Features/Packages)移除:通过
Remove-WindowsPackage命令移除系统功能和组件
预安装应用移除实现
在tiny11maker.ps1的第205-258行,定义了一个应用包前缀列表$packagePrefixes,包含了需要移除的应用包名称前缀:
$packagePrefixes = 'AppUp.IntelManagementandSecurityStatus',
'Clipchamp.Clipchamp',
'DolbyLaboratories.DolbyAccess',
# ... 其他应用前缀
'MicrosoftCorporationII.QuickAssist',
'MSTeams',
'MicrosoftTeams',
'Microsoft.WindowsTerminal',
'Microsoft.549981C3F5F10'
然后在第259-265行,脚本会获取当前映像中所有已安装的应用包,并筛选出与前缀列表匹配的包进行移除:
$packagesToRemove = $packages | Where-Object {
$packageName = $_
$packagePrefixes -contains ($packagePrefixes | Where-Object { $packageName -like "*$_*" })
}
foreach ($package in $packagesToRemove) {
& 'dism' '/English' "/image:$($ScratchDisk)\scratchdir" '/Remove-ProvisionedAppxPackage' "/PackageName:$package"
}
系统组件移除实现
在tiny11Coremaker.ps1中,系统组件移除机制更加灵活。第135-149行定义了系统包名称模式列表:
$packagePatterns = @(
"Microsoft-Windows-InternetExplorer-Optional-Package~31bf3856ad364e35",
"Microsoft-Windows-Kernel-LA57-FoD-Package~31bf3856ad364e35~amd64",
# ... 其他系统组件模式
"Microsoft-Windows-StepsRecorder-Package~"
)
这些模式使用通配符匹配系统组件包名称,然后通过DISM命令移除匹配的组件。
创建自定义组件移除模块
为了添加自定义组件移除规则,我们可以创建一个独立的模块化配置文件,然后在主脚本中引用它。这种方式可以避免直接修改核心脚本,便于后续升级。
步骤1:创建自定义配置文件
在项目根目录下创建一个新的PowerShell脚本文件CustomRemovalRules.ps1,用于存放自定义移除规则:
# CustomRemovalRules.ps1
# 自定义应用包前缀列表
$customAppPrefixes = @(
'Your.Custom.App.Prefix1',
'Your.Custom.App.Prefix2'
)
# 自定义系统组件模式列表
$customPackagePatterns = @(
"Microsoft-Windows-CustomFeature-Package~31bf3856ad364e35",
"Custom.Vendor.Feature-Package~*"
)
# 导出变量供主脚本使用
Export-ModuleMember -Variable customAppPrefixes, customPackagePatterns
步骤2:修改主脚本引用自定义规则
编辑tiny11maker.ps1,在第204行($packagePrefixes定义之前)添加以下代码来导入自定义规则:
# 导入自定义移除规则
if (Test-Path "$PSScriptRoot\CustomRemovalRules.ps1") {
Import-Module "$PSScriptRoot\CustomRemovalRules.ps1" -Force
Write-Output "Loaded custom removal rules from CustomRemovalRules.ps1"
} else {
Write-Output "No custom removal rules found. Using default rules only."
$customAppPrefixes = @()
$customPackagePatterns = @()
}
步骤3:合并默认规则与自定义规则
修改tiny11maker.ps1中的$packagePrefixes定义,将默认前缀与自定义前缀合并:
$packagePrefixes = 'AppUp.IntelManagementandSecurityStatus',
'Clipchamp.Clipchamp',
# ... 保留原有前缀列表 ...
'Microsoft.549981C3F5F10' + $customAppPrefixes # 添加此行合并自定义前缀
同样,对于系统组件移除部分,修改$packagePatterns定义,合并默认模式与自定义模式:
$packagePatterns = @(
"Microsoft-Windows-InternetExplorer-Optional-Package~31bf3856ad364e35",
# ... 保留原有模式列表 ...
"Microsoft-Windows-StepsRecorder-Package~"
) + $customPackagePatterns # 添加此行合并自定义模式
高级:基于条件的动态移除规则
除了静态列表外,我们还可以添加基于条件的动态移除规则。例如,根据Windows版本、语言或硬件架构来决定是否移除某些组件。
示例:根据系统架构移除组件
在CustomRemovalRules.ps1中添加以下代码:
# 根据系统架构定义条件移除规则
$architecture = (Get-WindowsImage -ImagePath $wimFilePath -Index $index).Architecture
$conditionalPackagePatterns = @()
if ($architecture -eq 'amd64') {
# x64架构特有组件
$conditionalPackagePatterns += "Microsoft-Windows-AMD64-Specific-Package~31bf3856ad364e35"
} elseif ($architecture -eq 'arm64') {
# ARM64架构特有组件
$conditionalPackagePatterns += "Microsoft-Windows-ARM64-Specific-Package~31bf3856ad364e35"
}
# 合并条件规则到自定义规则
$customPackagePatterns += $conditionalPackagePatterns
验证自定义规则的有效性
添加自定义规则后,建议通过以下步骤验证其有效性:
- 运行脚本并检查日志:脚本执行时会生成详细日志文件,默认路径为
$PSScriptRoot\tiny11_$(get-date -f yyyyMMdd_HHmms).log - 检查移除操作输出:在日志中搜索关键词
Removing package或Remove-ProvisionedAppxPackage,确认自定义规则中的组件是否被正确识别和移除 - 测试生成的映像:使用虚拟机测试生成的Windows 11映像,确认自定义移除的组件确实已被移除,且系统功能正常
自动化与扩展:创建组件移除配置文件
为了进一步提高灵活性,可以将移除规则定义在JSON或XML配置文件中,而不是PowerShell脚本。例如,创建removal-rules.json:
{
"appPrefixes": [
"Your.Custom.App.Prefix1",
"Your.Custom.App.Prefix2"
],
"packagePatterns": [
"Microsoft-Windows-CustomFeature-Package~31bf3856ad364e35",
"Custom.Vendor.Feature-Package~*"
],
"conditionalRules": [
{
"condition": "architecture == 'amd64'",
"packagePatterns": [
"Microsoft-Windows-AMD64-Specific-Package~31bf3856ad364e35"
]
}
]
}
然后在CustomRemovalRules.ps1中添加代码解析此JSON文件:
# 从JSON文件加载自定义规则
$jsonRulesPath = "$PSScriptRoot\removal-rules.json"
if (Test-Path $jsonRulesPath) {
$jsonRules = Get-Content $jsonRulesPath | ConvertFrom-Json
$customAppPrefixes = $jsonRules.appPrefixes
$customPackagePatterns = $jsonRules.packagePatterns
# 处理条件规则
foreach ($rule in $jsonRules.conditionalRules) {
if (Invoke-Expression $rule.condition) {
$customPackagePatterns += $rule.packagePatterns
}
}
}
这种方式使得非技术用户也能通过编辑JSON文件来定义自定义移除规则,无需修改PowerShell脚本。
总结与注意事项
通过本文介绍的方法,您可以轻松扩展tiny11builder的组件移除功能,实现个性化的Windows 11精简需求。在添加自定义规则时,请注意以下几点:
- 谨慎移除系统组件:某些系统组件是核心功能所必需的,不当移除可能导致系统不稳定或功能缺失。建议先在虚拟机中测试自定义规则
- 保留必要的驱动支持:避免移除特定硬件所需的驱动程序包,特别是存储控制器、网络适配器等关键设备的驱动
- 注意Windows更新兼容性:过度精简可能导致后续Windows更新失败,建议定期检查更新兼容性
tiny11builder的模块化设计使得自定义扩展变得简单灵活。通过合理利用本文介绍的方法,您可以创建满足特定需求的高度定制化Windows 11精简版本。完整的项目文件结构和更多使用细节,请参考项目文档README.md。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



