tiny11builder模块化设计:如何为脚本添加自定义组件移除规则

tiny11builder模块化设计:如何为脚本添加自定义组件移除规则

【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 【免费下载链接】tiny11builder 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder

tiny11builder是一个用于构建精简版Windows 11镜像的工具集,通过移除不必要的组件和应用程序来减小系统体积并提升性能。项目核心脚本tiny11maker.ps1tiny11Coremaker.ps1采用了模块化设计,允许用户根据需求自定义组件移除规则。本文将详细介绍如何扩展这些脚本以添加自定义的组件移除规则。

了解现有组件移除机制

tiny11builder通过DISM(部署映像服务和管理工具)命令行工具来管理Windows映像中的组件。在tiny11maker.ps1中,主要通过以下两种方式移除组件:

  1. 预安装应用包(Provisioned Appx Packages)移除:通过Remove-ProvisionedAppxPackage命令移除Windows预装应用
  2. 系统组件包(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

验证自定义规则的有效性

添加自定义规则后,建议通过以下步骤验证其有效性:

  1. 运行脚本并检查日志:脚本执行时会生成详细日志文件,默认路径为$PSScriptRoot\tiny11_$(get-date -f yyyyMMdd_HHmms).log
  2. 检查移除操作输出:在日志中搜索关键词Removing packageRemove-ProvisionedAppxPackage,确认自定义规则中的组件是否被正确识别和移除
  3. 测试生成的映像:使用虚拟机测试生成的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精简需求。在添加自定义规则时,请注意以下几点:

  1. 谨慎移除系统组件:某些系统组件是核心功能所必需的,不当移除可能导致系统不稳定或功能缺失。建议先在虚拟机中测试自定义规则
  2. 保留必要的驱动支持:避免移除特定硬件所需的驱动程序包,特别是存储控制器、网络适配器等关键设备的驱动
  3. 注意Windows更新兼容性:过度精简可能导致后续Windows更新失败,建议定期检查更新兼容性

tiny11builder的模块化设计使得自定义扩展变得简单灵活。通过合理利用本文介绍的方法,您可以创建满足特定需求的高度定制化Windows 11精简版本。完整的项目文件结构和更多使用细节,请参考项目文档README.md

【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 【免费下载链接】tiny11builder 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值