function ListWindowsFeatures { param( [string]$feature, [string]$provider="dism" ) $cachepath = "${env:temp}/ListWindowsFeatures-${provider}.xml" $maxAge = 2 $cache = Get-Item $cachepath -erroraction SilentlyContinue if($cache -ne $null -and ((get-date) - $cache.LastWriteTime).minutes -lt $maxage){ $features = Import-Clixml $cachepath | Select *| Where-Object {(($_.name -like $feature) -or ($_.displayName -like $feature)) -and (($_.installed -eq $true) -or ($_.state -eq "Enabled"))} return $features } else{ switch($provider) { "dism" { return features_dism | Select * | Where-Object {($_.name -eq $feature) -and ($_.state -eq "Enabled")} } "powershell" { return features_powershell | Select * | Where-Object {(($_.name -like $feature) -or ($_.displayName -like $feature)) -and ($_.installed -eq $true)} } default {throw "Unsupported provider"} } } } function features_dism{ try { $out = DISM /Online /Get-Features /Format:List | Where-Object {$_} if($LASTEXITCODE -ne 0) { Write-Error $out Break } $f = $out[4..($out.length-2)] $features = for($i=0; $i -lt $f.length;$i+=2) { $tmp = $f[$i],$f[$i+1] -replace '^([^:]+:\s)' New-Object PSObject -Property @{ Name = $tmp[0] State = $tmp[1] } } $features | Export-Clixml $cachepath return $features } catch { Throw } } function features_powershell{ $ProgressPreference = "SilentlyContinue" import-module servermanager $features = Get-WindowsFeature $features | Export-Clixml $cachepath return Get-WindowsFeature }