powershell - 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]
类型和带有(单个)点的数字自动转换为 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-StrictMode
cmdlet:
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.
推荐阅读
- java - Java反射包静态final
- visual-studio - Visual Studio 15 2017 和 cmake 发布版本
- python - 返回 json 响应而不是 Django 模型列表
- kotlin - 如何在android中存储与应用程序的一位用户相关的安全登录信息?
- windows-services - 为什么从服务子进程调用时 CreateProcessAsUser 失败并显示“拒绝访问”
- c# - FluentValidation with Regular Expression not allowing N/A or NA Ignoring Case and White Space
- maven - 如何使用 Gitlab CI/CD 在 aws 上部署 maven 项目
- python - 在操作中克隆组织内的私有 github 存储库
- python - 将张量列表除以张量流中的标量列表?
- jquery - Kendo Grid - 网格过滤时自动完成失败