如何使用dism.exe检查Windows功能是否在Windows7上开启on/off?
How to use dism.exe to check whether Windows Features are turned on/off on Windows 7?
我使用Get-WindowsOptionalFeature查看Windows功能是否开启on/off成功,但是Windows7不支持该指令
$IIS_InstallPro = "IIS-WebServerRole","IIS-WebServer","IIS-CommonHttpFeatures","IIS-HttpErrors"
#$features = Get-WindowsOptionalFeature -Online -FeatureName IIS*
$features = Dism /Online /Get-Features
function CheckIIS{
foreach($feature in $features)
{
if($feature.State -eq "Disabled" -and $IIS_InstallPro -match $feature.FeatureNmae)
{
return $False
}
}
return $true
}
CheckIIS
我应该使用 dism.exe 检查并 return 结果吗?
想知道这样做是否是好的做法以及最好的做法是什么?
不,没有办法让这些 cmdlet 在 Windows 7 上运行。
虽然您确实不应该再使用 Windows 7,但您仍然应该能够从 WMI 获取此信息。我不记得 Get-CimInstnace
cmdlet 在 7 上是否可用,所以我将使用 Get-WmiObject
方法:
Function Get-WmiWindowsOptionalFeatures {
[CmdletBinding()]
Param(
[string]$FeatureName,
[ValidateSet('Enabled', 'Disabled', 'Absent', 'Unknown', '1', '2', '3', '4')]
[string]$InstallState
)
Get-WmiObject Win32_OptionalFeature | Where-Object {
$feature = $_
$featureMatch = !$FeatureName -or ( $FeatureName -and $feature.Name -like $FeatureName )
$installStateMatch = switch ( $InstallState ) {
{ $_ -in 'Enabled', '1' } {
$feature.InstallState -eq 1
break
}
{ $_ -in 'Disabled', '2' } {
$feature.InstallState -eq 2
break
}
{ $_ -in 'Absent', '3' } {
$feature.InstallState -eq 3
break
}
{ $_ -in 'Unknown', '4' } {
$feature.InstallState -eq 4
break
}
default {
$true
break
}
}
$featureMatch -and $installStateMatch
} | Select-Object Name, Caption, Description, InstallDate, @{
Label = 'InstallState'
Expression = {
switch ( $_.InstallState ) {
1 {
'Enabled'
break
}
2 {
'Disabled'
break
}
3 {
'Absent'
break
}
4 {
'Unknown'
break
}
default {
$_.ToString()
break
}
}
}
}
}
这会给你一个很好的可操作对象,其中包含可以评估和操作的重要字段。您必须检查的 class 是 Win32_OptionalFeatures
.
要使用函数:
- 无参数:returns 所有特征
-FeatureName
:returns 个特征匹配 Name
。支持 -like
模式。
-InstallState
:returns 个特征匹配 InstallState
。采用方便的字符串或下面映射的编号值。
要了解安装状态,以下是每个可能的值(它们存储为 uint32
):
- 已启用
- 已禁用
- 缺席
- 未知
遗憾的是,无法使用 WMI 安装 功能,因此您必须使用 dism.exe
.
安装它们
我使用Get-WindowsOptionalFeature查看Windows功能是否开启on/off成功,但是Windows7不支持该指令
$IIS_InstallPro = "IIS-WebServerRole","IIS-WebServer","IIS-CommonHttpFeatures","IIS-HttpErrors"
#$features = Get-WindowsOptionalFeature -Online -FeatureName IIS*
$features = Dism /Online /Get-Features
function CheckIIS{
foreach($feature in $features)
{
if($feature.State -eq "Disabled" -and $IIS_InstallPro -match $feature.FeatureNmae)
{
return $False
}
}
return $true
}
CheckIIS
我应该使用 dism.exe 检查并 return 结果吗? 想知道这样做是否是好的做法以及最好的做法是什么?
不,没有办法让这些 cmdlet 在 Windows 7 上运行。
虽然您确实不应该再使用 Windows 7,但您仍然应该能够从 WMI 获取此信息。我不记得 Get-CimInstnace
cmdlet 在 7 上是否可用,所以我将使用 Get-WmiObject
方法:
Function Get-WmiWindowsOptionalFeatures {
[CmdletBinding()]
Param(
[string]$FeatureName,
[ValidateSet('Enabled', 'Disabled', 'Absent', 'Unknown', '1', '2', '3', '4')]
[string]$InstallState
)
Get-WmiObject Win32_OptionalFeature | Where-Object {
$feature = $_
$featureMatch = !$FeatureName -or ( $FeatureName -and $feature.Name -like $FeatureName )
$installStateMatch = switch ( $InstallState ) {
{ $_ -in 'Enabled', '1' } {
$feature.InstallState -eq 1
break
}
{ $_ -in 'Disabled', '2' } {
$feature.InstallState -eq 2
break
}
{ $_ -in 'Absent', '3' } {
$feature.InstallState -eq 3
break
}
{ $_ -in 'Unknown', '4' } {
$feature.InstallState -eq 4
break
}
default {
$true
break
}
}
$featureMatch -and $installStateMatch
} | Select-Object Name, Caption, Description, InstallDate, @{
Label = 'InstallState'
Expression = {
switch ( $_.InstallState ) {
1 {
'Enabled'
break
}
2 {
'Disabled'
break
}
3 {
'Absent'
break
}
4 {
'Unknown'
break
}
default {
$_.ToString()
break
}
}
}
}
}
这会给你一个很好的可操作对象,其中包含可以评估和操作的重要字段。您必须检查的 class 是 Win32_OptionalFeatures
.
要使用函数:
- 无参数:returns 所有特征
-FeatureName
:returns 个特征匹配Name
。支持-like
模式。-InstallState
:returns 个特征匹配InstallState
。采用方便的字符串或下面映射的编号值。
要了解安装状态,以下是每个可能的值(它们存储为 uint32
):
- 已启用
- 已禁用
- 缺席
- 未知
遗憾的是,无法使用 WMI 安装 功能,因此您必须使用 dism.exe
.