...你可能不想使用这两种类型,
而是使用[版本]
类类型:
$version = [Version]'2.0.7.0'
$version -gt [Version]'2.0'
True
$version -gt [Version]'2.1'
False
$version -gt [Version]'2.0.9'
False
针对您尝试的内容:
正如您自己所指出的,WMI
查询的 version
属性返回一个 [String]
类型,并且带有(单个)点的数字会自动转换为 [Double]
。知道 LHS(左手边)操作符的类型决定比较类型,问题中所有相关的比较示例都是字符串比较。这意味着:
'2.0.7.0' -gt '2.0'
True
'2.0.7.0' -gt '2.1'
False
意外的是,一个没有引号的带有两个或更多点的数字会返回
$Null
:
$Null -eq 2.0.9
True
以下比较中将被转换为空字符串:
'2.0.7.0' -gt 2.0.9
True
我已经为此问题创建了一个新的PowerShell请求:
#15756
两个或更多点的未引用数字应转换为[version]
而不是$Null
附录
关于为什么有两个或更多点的数字不会产生(语法)错误的解释已在相关#15756
请求的响应中涵盖。
实际上,只有第一个点被解释为十进制分隔符, 其余的点被假定为成员(属性/方法)分隔符。
默认情况下,PowerShell不是一种严格的语言。这意味着如果您引用任何对象类型(包括字符串和甚至基元)的不存在的属性,它只会返回$Null
。
什么???我可以理解原始类型有像2.0.ToInt32($Null)
这样的方法,但是一个原始类型如何有一个(自定义)属性,比如9
?
在PowerShell中,使用Add-Member
cmdlet,可以“装饰”(添加属性到)任何对象:
$Version = 2.0 |Add-Member 9 'Nine' -PassThru
$Version |ConvertTo-Json
{
"value": 2.0,
"9": "Nine"
}
$Version -is [Double]
True
$Version.9
Nine
为了在引用不存在的属性时强制出现错误,您可以使用
Set-StrictMode
cmdlet:
Set-StrictMode -Version Latest
2.0.9
属性未找到异常:在此对象上找不到属性“9”。请验证该属性是否存在。
2.0.9 -is [double]
也返回一个字符串。 - Lieven Keersmaekers$version -eq 2.0.7.0
返回 False。(版本相同) - Franxi Hidro$version -gt 2.0.9
和$version -gt 2.0.6
都返回 true。实际上,它只是与 $null 进行比较,而不是像我预期的那样与字符串进行比较。 - Lieven Keersmaekers#15756
两个或多个点没有引号的数字应该转换为[version]
而不是$Null
。 - iRon