2024-11-06 19:11:36 +01:00
function Microwin-RemoveFeatures () {
<#
. SYNOPSIS
Removes certain features from ISO image
2025-01-10 20:40:25 +01:00
.PARAMETER UseCmdlets
Determines whether or not to use the DISM cmdlets for processing.
- If true, DISM cmdlets will be used
- If false, calls to the DISM executable will be made whilst selecting bits and pieces from the output as a string (that was how MicroWin worked before
the DISM conversion to cmdlets)
2024-11-06 19:11:36 +01:00
. EXAMPLE
2025-01-10 20:40:25 +01:00
Microwin-RemoveFeatures -UseCmdlets $true
2024-11-06 19:11:36 +01:00
#>
2025-01-10 20:40:25 +01:00
param (
[ Parameter ( Mandatory = $true , Position = 0 )] [ bool ] $UseCmdlets
)
2024-11-06 19:11:36 +01:00
try {
2025-01-10 20:40:25 +01:00
if ( $UseCmdlets ) {
$featlist = ( Get-WindowsOptionalFeature -Path " $scratchDir " )
2024-11-06 19:11:36 +01:00
2025-01-10 20:40:25 +01:00
$featlist = $featlist | Where-Object {
$_ . FeatureName -NotLike "*Defender*" -AND
$_ . FeatureName -NotLike "*Printing*" -AND
$_ . FeatureName -NotLike "*TelnetClient*" -AND
$_ . FeatureName -NotLike "*PowerShell*" -AND
$_ . FeatureName -NotLike "*NetFx*" -AND
$_ . FeatureName -NotLike "*Media*" -AND
$_ . FeatureName -NotLike "*NFS*" -AND
$_ . FeatureName -NotLike "*SearchEngine*" -AND
$_ . FeatureName -NotLike "*RemoteDesktop*" -AND
$_ . State -ne "Disabled"
}
} else {
$featList = dism / english / image = " $scratchDir " / get-features | Select-String -Pattern "Feature Name : " -CaseSensitive -SimpleMatch
if ($?) {
$featList = $featList -split "Feature Name : " | Where-Object { $_ }
# Exclude the same items. Note: for now, this doesn't exclude those features that are disabled.
# This will appear in the future
$featList = $featList | Where-Object {
$_ -NotLike "*Defender*" -AND
$_ -NotLike "*Printing*" -AND
$_ -NotLike "*TelnetClient*" -AND
$_ -NotLike "*PowerShell*" -AND
$_ -NotLike "*NetFx*" -AND
$_ -NotLike "*Media*" -AND
$_ -NotLike "*NFS*" -AND
$_ -NotLike "*SearchEngine*" -AND
$_ -NotLike "*RemoteDesktop*"
}
} else {
Write-Host "Features could not be obtained with DISM. MicroWin processing will continue, but features will be skipped."
return
}
2024-11-06 19:11:36 +01:00
}
2025-01-10 20:40:25 +01:00
if ( $UseCmdlets ) {
foreach ( $feature in $featList ) {
$status = "Removing feature $( $feature . FeatureName ) "
Write-Progress -Activity "Removing features" -Status $status -PercentComplete ( $counter ++/ $featlist . Count * 100 )
Write-Debug "Removing feature $( $feature . FeatureName ) "
Disable-WindowsOptionalFeature -Path " $scratchDir " -FeatureName $ ( $feature . FeatureName ) -Remove -ErrorAction SilentlyContinue -NoRestart
}
} else {
foreach ( $feature in $featList ) {
$status = "Removing feature $feature "
Write-Progress -Activity "Removing features" -Status $status -PercentComplete ( $counter ++/ $featlist . Count * 100 )
Write-Debug "Removing feature $feature "
dism / english / image = " $scratchDir " / disable-feature / featurename = $feature / remove / quiet / norestart | Out-Null
if ($? -eq $false ) {
Write-Host "Feature $feature could not be disabled."
}
}
2024-11-06 19:11:36 +01:00
}
Write-Progress -Activity "Removing features" -Status "Ready" -Completed
Write-Host "You can re-enable the disabled features at any time, using either Windows Update or the SxS folder in <installation media>\Sources."
} catch {
2025-01-10 20:40:25 +01:00
Write-Host "Unable to get information about the features. A fallback will be used..."
2024-11-06 19:11:36 +01:00
Write-Host "Error information: $( $_ . Exception . Message ) " -ForegroundColor Yellow
2025-01-10 20:40:25 +01:00
Microwin-RemoveFeatures -UseCmdlets $false
2024-11-06 19:11:36 +01:00
}
}