Powershell如何在字符串和双精度之间进行比较?

我刚刚意识到 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

回答

...并且您可能不想使用这些类型中的任何一种,
而是使用[Version]类类型:

$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

对于您尝试过的:

正如您自己指出的那样,查询的version属性WMI返回一个[String]类型和带有(单)点自动转换为[Double]. 知道运算符的 LHS(左侧)的类型决定了比较类型,问题中所有相关的比较示例都是字符串比较。意义:

'2.0.7.0' -gt '2.0'
True
'2.0.7.0' -gt '2.1'
False

但出乎意料的是,带有 2 个或更多点的(未加引号的)数字返回一个$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请求的响应中介绍了为什么具有 2 个或更多点的数字不会产生(语法)错误的解释。

事实上,只有第一个点被解释为小数分隔符,其余的点被假定为成员(属性/方法)分隔符。
默认情况下,PowerShell 不是一种严格的语言。这意味着如果您引用任何对象类型(包括字符串甚至原语)的不存在的属性,它只会返回$Null.

嗯???,我可以理解一个基元有像这样的方法,2.0.ToInt32($Null)但是一个基元怎么可能double有一个(自定义)属性,例如9
在 PowerShell 中,可以使用cmdlet来“装饰”(向其添加属性)任何对象:Add-Member

$Version = 2.0 |Add-Member 9 'Nine' -PassThru
$Version |ConvertTo-Json
{
  "value": 2.0,
  "9": "Nine"
}
$Version -is [Double]
True
$Version.9
Nine

要在引用不存在的属性时强制出错,可以使用Set-StrictModecmdlet:

Set-StrictMode -Version Latest
2.0.9 # Similar to e.g.: $Version.0

PropertyNotFoundException: The property '9' cannot be found on this object. Verify that the property exists.


以上是Powershell如何在字符串和双精度之间进行比较?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>