如何在Windows 10

时间:2016-05-20 17:50:35

标签: powershell windows-10

我正在尝试在安装之前检查是否安装了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,输出为字符串,与正则表达式匹配,与-eqcontains匹配,但无效。

函数get $FeatureName没问题,'因为安装有效。

如何使这项工作?

1 个答案:

答案 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动词的函数在我的机器上安装任何东西