【发布时间】:2019-05-06 13:39:30
【问题描述】:
我想使用 PowerShell 检查操作系统版本。脚本是这样的:
$a = "6.3.9600"
$a -match "6.0"
我在 PowerShell ISE 上运行此脚本,此脚本返回 $true。为什么?
【问题讨论】:
标签: regex powershell match version
我想使用 PowerShell 检查操作系统版本。脚本是这样的:
$a = "6.3.9600"
$a -match "6.0"
我在 PowerShell ISE 上运行此脚本,此脚本返回 $true。为什么?
【问题讨论】:
标签: regex powershell match version
至于您测试版本字符串的特定用例,.NET 提供了一个Version class,在此处很有用。你可以像这样创建一个实例...
$version = [Version] $a
...或者像这样...
$version = [Version]::Parse($a)
有主要版本、次要版本、构建和修订的属性...
PS> $version
Major Minor Build Revision
----- ----- ----- --------
6 3 9600 -1
然后您可以执行这样的测试...
PS> $version.Major -eq 6
True
PS> $version.Major -eq 6 -and $version.Minor -eq 3
True
PS> $version.Major -eq 6 -and $version.Minor -ge 3
True
PS> $version.Major -eq 6 -and $version.Minor -gt 3
False
【讨论】:
PowerShell -match 是正则表达式匹配,其中句点. 匹配任何字符。所以对于你的代码:
$a = "6.3.9600"
$a -match "6.0"
找到匹配项,如 "600" 'matches' "6.0"。
如果您想专门搜索句号,则需要将其转义,将其替换为\.:
"600" -match "6.0"
True
"600" -match "6\.0"
False
$a = "6.3.9600"
$a -match "6\.0"
False
【讨论】:
^6\.0 将匹配锚定到输入字符串的开头,以免匹配,例如版本6.6.0 应该曾经发布过.
powershell 可以为此使用 dotnet [version] 类型的加速器。它理解版本号,因此它知道6.0.9.1 小于6.0.11.1。这是一个演示......
$FoundVersion = [version]'6.3.9600'
$WantedVersion = [version]'6.0'
'Is it greater or equal? = {0}' -f ($FoundVersion -ge $WantedVersion)
'Is it equal? = {0}' -f ($FoundVersion -eq $WantedVersion)
输出...
Is it greater or equal? = True
Is it equal? = False
【讨论】:
-match 的使用似乎是一种非常迂回的方式来获得答案——一旦知道[version] 类型的加速器。我看到您已经对正则表达式处理点的方式有了答案。不用客气! [咧嘴]