Add-Member к объекту WMI передовой опыт? - PullRequest
0 голосов
/ 22 мая 2018

Я пишу функцию для получения версии Windows, используя объект WMI.Но я хотел добавить в объект 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 голосов
/ 22 мая 2018

Рекомендую использовать расчетные свойства :

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
                }
            }}
}
0 голосов
/ 22 мая 2018

Чтобы расширить мой комментарий:

Я бы не советовал менять класс wmi, который вам не нужен, но вы этого не делаете.Я не вижу ничего плохого в вашем подходе, кроме добавления члена к определенному стандартному библиотечному классу (System.Version) и выполнения сравнения чисел со строкой.

Я бы предложил создатьa [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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...