如何在 Powershell 中比较字符串和双精度数?

3

我刚刚意识到PowerShell可以比较字符串和数字,我不理解这一点,因为它们是不同的类型。 PowerShell如何进行比较呢?

PS C:\> Get-Host | Select-Object Version

Version
-------
5.1.19041.1023


PS C:\> $version = (Get-WmiObject -Class Win32_Product | where name -eq 'AWS Command Line Interface v2').Version
PS C:\> $version
2.0.7.0
PS C:\> $version -is [string]
True
PS C:\> 2.0 -is [double]
True
PS C:\> $version -gt 2.0
True
PS C:\> $version -gt 2.1
False
PS C:\> $version -gt 2.0.9
True

它并不是转换为双精度浮点数,而是将其转换为字符串,并像“'b'-gt'a或其他'”一样进行字符串比较。2.0.9 -is [double] 也返回一个字符串。 - Lieven Keersmaekers
@LievenKeersmaekers 如果这是字符串比较,为什么 $version -eq 2.0.7.0 返回 False。(版本相同) - Franxi Hidro
1
$Null -eq 2.0.9 ==> 真 - iRon
1
$version -gt 2.0.9$version -gt 2.0.6 都返回 true。实际上,它只是与 $null 进行比较,而不是像我预期的那样与字符串进行比较。 - Lieven Keersmaekers
3
我已经为此创建了一个新的PowerShell请求:#15756 两个或多个点没有引号的数字应该转换为 [version] 而不是 $Null - iRon
显示剩余6条评论
1个回答

8

...你可能不想使用这两种类型,
而是使用[版本]类型:

$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 # --> '2.0.7.0' -gt $Null --> '2.0.7.0' -gt ''
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 # Similar to e.g.: $Version.0

属性未找到异常:在此对象上找不到属性“9”。请验证该属性是否存在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接