Если заявление для версии ОС - PullRequest
0 голосов
/ 20 мая 2018

Я не получаю это на работу, и я действительно запутался, почему это не работает.Моя версия ОС 10.0.14393, но она все еще печатает, что она ниже 6?Что здесь не так?

$verCheckOS = (Get-WmiObject Win32_OperatingSystem).Version

if ($verCheckOS -lt 6) {
    Write-Host -ForeGroundColor Red "Version is too low, $verCheckOS"
} else { 
    Write-Host -ForegroundColor Green "OS version is good, $verCheckOS"
}

Это ниже с простыми числами хорошо работает, поэтому я не знаю, является ли номер версии ОС каким-то конкретным типом данных?Как сравнить номер версии ОС с оператором if?

$value = 10

if ($value -lt 6) {
    Write-Host "Value is lower than 6"
} else {
    Write-Host "Value is greater than 6"
}

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

(Get-WmiObject win32_operatingsystem).version возвращает строку (канал для Get-Member для проверки), поэтому $verCheckOS -lt 6 выполняет лексическое сравнение:

  PS> '10.0.14393' -lt 6  # *lexical* comparison; 6 is coerced to a string
  True # !! lexically, '1' comes before '6'

Приведение к[version] позволяет выполнить запланированное численное сравнение на основе свойства .Major:

 PS> $verCheckOS = [version] (Get-WmiObject win32_operatingsystem).version
 PS> $verCheckOS.Major -lt 6  # 10 -lt 6 - numerical comparison
 False # OK

Полезный ответ Адама Парсона показывает, что также возможноЗначительно сравнить два [version] экземпляра в целом с -lt, что позволяет использовать более детальную логику сравнения.

0 голосов
/ 20 мая 2018

Если вы введете переменную $verCheckOS, произойдет нечто более интересное:

[version]$verCheckOS = (Get-WmiObject win32_operatingsystem).version

При запуске предоставленного вами кода мы получим ошибку:

if($verCheckOS -lt 6) { write-host -ForeGroundColor Red "Version is too low, $verCheckOS" }
Else { write-host -ForegroundColor Green "OS version is good, $verCheckOS" }

Could not compare "10.0.17134" to "6". Error: "Cannot convert value "6" to type "System.Version". 
Error: "Version string portion was too short or too long.""
At line:1 char:8

Чтов данном случае переменная $verCheckOS теперь является типом данных [version], а одиночное целое число 6 не может быть преобразовано в тип данных [version].Для преобразования требуется как минимум 2 октета, поскольку тип данных [version] представлен следующим образом:

Major  Minor  Build  Revision
-----  -----  -----  --------
10     0      17134  -1      

Существует несколько способов справиться с этим в зависимости от того, какое число вы используете.пытаюсь сравнить.Если вы просто хотите сравнить октет версии Major, вы можете сравнить целые числа в отличие от версий:

if($verCheckOS.Major -lt 6) { write-host -ForeGroundColor Red "Version is too low, $verCheckOS" }
Else { write-host -ForegroundColor Green "OS version is good, $verCheckOS" }

Это даст положительный результат, экстраполируя номер версии Majorи создание целочисленного к целочисленному сравнению.

Если вы хотите сравнить реальные «версии», то вам нужно будет обеспечить сравнение с двумя объектами версий, вот пример:

[version]$verCheckOS = (Get-WmiObject win32_operatingsystem).version
[version]$verCompare = "6.0"

if($verCheckOS -lt $verCompare) { write-host -ForeGroundColor Red "Version is too low, $verCheckOS" }
Else { write-host -ForegroundColor Green "OS version is good, $verCheckOS" }

Чтобы увидеть преобразование строки в версию в действии или попытаться проанализировать ваши собственные номера версий, используйте класс [version] .NET, например:

[version]::new("6.0")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...