首页 > 解决方案 > 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

标签: powershell

解决方案


...而且您可能不想使用这些类型中的任何一种,
而是使用[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]类型和带有(单个)点的数字自动转换为 a [Double]。知道运算符的 LHS(左侧)的类型决定了比较类型,问题中所有相关的比较示例都是字符串比较。意义:

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

但出乎意料的是,带有 2 个或更多点的(未加引号的)数字返回 a $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带有两个或多个点的未引用数字应该转换为 a[version]而不是$Null


附录相关请求
的响应中涵盖了为什么具有 2 个或更多点的数字不会产生(语法)错误的解释。#15756

事实上,只有第一个点被解释为小数分隔符,其余的点是假定的成员(属性/方法)分隔符
默认情况下,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.


推荐阅读