Add-Member到WMI对象的最佳实践?

时间:2018-05-21 21:05:20

标签: windows powershell object wmi

我正在编写一个使用WMI对象获取Windows版本的函数。但我想将Windows 10 ReleaseId(“1709”)(来自注册表项)添加到对象中。

这是一个愚蠢的想法吗? (它有效,我只是不知道这样做是否明智。)

function Get-OSVersion {
    [version]$OSVersion = (Get-WmiObject -Class Win32_OperatingSystem).Version

    if ($OSVersion.Major -ge '10') {
        $OSVersion | Add-Member -MemberType NoteProperty -Name ReleaseId -Value $([int]::Parse($(Get-ItemProperty -Path "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" ReleaseId).ReleaseId)) -Force
    }

    return $OSVersion
}

$OSVersion = Get-OSVersion
if ($OSVersion -ge '6.1') {"At least Win7"} else {"Too old"}
if ($OSVersion.ReleaseID -ge '1703') {"At least 1703."} else {"Too old"}

另外,覆盖成员“Revision”(值总是-1)而不是添加新成员“ReleaseId”是不明智的吗?

2 个答案:

答案 0 :(得分:2)

扩展我的评论:

  

我不建议改变你不需要的wmi课程,但你并没有这样做。除了将成员添加到已定义的标准库类(System.Version)并对字符串进行数字比较之外,我不会发现您的方法有任何问题。

我建议您使用所需的成员创建[pscustomobject]

function Get-OSVersion {
    $OSVersion = [version](Get-CimInstance -ClassName Win32_OperatingSystem).Version

    if ($OSVersion.Major -ge 10) {
        [pscustomobject]@{
            Version = $OSVersion
            ReleaseId = [int](Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion').ReleaseId
        }
    } else {
        [pscustomobject]@{
            Version = $OSVersion
        }
    }
}

使用中:

$OS = Get-OSVersion
if ($OS.Version -ge [version]'6.1') {
    'At least Win7'
} else {
    'Too old'
}
if ($OS.ReleaseId -ge 1703) {
    'At least 1703.'
} else {
    'Too old'
}

提供替代方案:使用哈希表,因为看起来您只是在没有任何方法实现的情况下进行键/值访问和比较。

function Get-OSVersion {
    $OS = @{
        Version = [version](Get-CimInstance -ClassName Win32_OperatingSystem).Version
    }

    if ($OS.Version.Major -ge 10) {
        $OS['ReleaseId'] = [int](Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion').ReleaseId
    }

    return $OS
}

答案 1 :(得分:2)

我的建议是使用calculated properties

function Get-OSVersion {
    Get-WmiObject -Class Win32_OperatingSystem |
        Select-Object @{n='Version';e={[version]$_.Version}},
            @{n='ReleaseId';e={
                if (([version]$_.Version).Major -ge '10') {
                    [int](Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion').ReleaseId
                }
            }}
}