Very important:
Please make sure necessary backups are in place before you perform this operation. First test in your dev/test environment and only then use in your production environment.
Ideally a feature will be scoped to a Farm, WebApplication, Site, or Web, but orphaned features won’t be having a scope. The command to list all orphaned features in a SharePoint farm is as follows…
PowerShell command to list all orphaned features…
Get-SPFeature | ? { $_.Scope -eq $null }
Sample output…
PS C:\windows\system32> Get-SPFeature | ? { $_.Scope -eq $null } DisplayName Id CompatibilityLevel Scope ----------- -- ------------------ ----- ReportServerCentralAdmin 5f2e3537-91b5-4341-86ff-90c6a2f99aae 14 ReportServerStapling 6bcbccc3-ff47-47d3-9468-572bf2ab9657 14 PowerView bf8b58f5-ebae-4a70-9848-622beaaf2043 14 ReportServerCentralAdmin 5f2e3537-91b5-4341-86ff-90c6a2f99aae 15 ReportServerStapling 6bcbccc3-ff47-47d3-9468-572bf2ab9657 15 PowerView bf8b58f5-ebae-4a70-9848-622beaaf2043 15
PowerShell command to delete an orphaned feature…
foreach($f in @(Get-SPFeature | ? { $_.DisplayName -eq "ReportServerCentralAdmin" })) { $f.Delete() }
Why did we need a foreach? Because a feature could be listed twice with different “CompatibilityLevel” values. So in this case “ReportServerCentralAdmin” is listed twice with “CompatibilityLevel” set to 14 and 15. So we delete both via $f.Delete().