如果是OS版本的声明

时间:2018-05-20 03:25:22

标签: windows powershell if-statement

我没有让这个工作,我真的很困惑为什么它不工作。我的操作系统版本是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 :(得分:4)

如果你对$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      

根据您尝试比较的数字,有多种方法可以解决这个问题。如果你只是想比较“主要”和“#39”。 version octet,你可以比较整数而不是版本:

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

通过推断“主要'”,这将带来积极的结果。版本号并进行整数比较。

如果您想比较真实的版本,那么您需要提供与2个版本对象的比较,以下是一个示例:

[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")

答案 1 :(得分:3)

(Get-WmiObject win32_operatingsystem).version会返回字符串(管道到Get-Member进行验证),因此$verCheckOS -lt 6执行 lexical 比较:

  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

Adam Parson's helpful answer表明,也可以将两个[version]实例作为一个整体与-lt进行有意义的比较,从而实现更细粒度的比较逻辑。

相关问题