我正在尝试在安装之前检查是否安装了Windows功能,以避免重新安装。
我正在用它来检查:
function Check-WindowsFeature {
[CmdletBinding()]
param(
[Parameter(Position=0,Mandatory=$true)] [string]$FeatureName
)
if((Get-WindowsOptionalFeature -FeatureName $FeatureName -Online) -Like "Enabled") {
# $FeatureName is Installed
# (simplified function to paste here)
} else {
# Install $FeatureName
}
}
}
但即使安装了功能,“if”也始终返回false 示例:
C:\> (Get-WindowsOptionalFeature -FeatureName Microsoft-Hyper-V-All -Online) -Like "Enabled"
False
C:\> Get-WindowsOptionalFeature -FeatureName Microsoft-Hyper-V-All -Online | ft -Property State
State
-----
Enabled
我已经尝试格式为表格,格式为宽广,过滤为-Property State
,输出为字符串,与正则表达式匹配,与-eq
和contains
匹配,但无效。
函数get $FeatureName
没问题,'因为安装有效。
如何使这项工作?
答案 0 :(得分:2)
因为Get-WindowsOptionalFeature的返回值是AdvancedFeatureObject
。您不能使用字符串在该对象上使用-Like
。
您必须访问该对象上的属性State
并进行比较:
function Check-WindowsFeature {
[CmdletBinding()]
param(
[Parameter(Position=0,Mandatory=$true)] [string]$FeatureName
)
if((Get-WindowsOptionalFeature -FeatureName $FeatureName -Online).State -eq "Enabled") {
# $FeatureName is Installed
# (simplified function to paste here)
} else {
# Install $FeatureName
}
}
顺便说一句,我会将函数的名称更改为Install-WindowsFeatureIfNotInstalled
,因为我不希望使用Check
动词的函数在我的机器上安装任何东西