测试 PowerShell 字符串相等性

问题描述 投票:0回答:1

我试图确定 PowerShell 中的 2 个应用程序版本字符串是否相同,但得到的结果令人困惑:

PS C:\> $version = wmic product where "caption like '%Citrix Workspace Inside%'" get Version
PS C:\> $versionString = "22.5.0.4"

PS C:\> $version[2]
22.5.0.4
PS C:\> $versionString
22.5.0.4
PS C:\> $version[2].GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object


PS C:\> $versionString.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object


PS C:\> $version[2] -eq $versionString
False

这与“wmic”命令返回的内容有关吗?

$version
的返回类型是
Object[]
,一个对象数组,因此我只是对其进行索引以获取我需要的字符串。
$version[2]
$versionString
具有相同的值和类型,但在比较相等性时返回 False。对此的任何说明将不胜感激。

谢谢

string windows powershell equality
1个回答
0
投票

首先,警告

  • Win32_Product
    WMI 类是最好避免,因为它仅返回 Windows Installer 安装的应用程序,并且未进行查询优化(即使在过滤时,也必须枚举所有产品),并且 - 最重要的是 - 始终执行一致性检查并可能触发修复操作。有关背景信息和替代方案,请参阅这篇优秀的博客文章

您的代码的唯一立即问题是返回的版本号有尾随空格

$version[2].Trim() -eq $versionString

但是,最好使用 Get-CimInstance

 从 WMI  检索信息,因为它会返回 对象,您可以访问其 属性
$version = (
  Get-CimInstance Win32_Product -Filter "caption like '%Citrix Workspace Inside%'"
).Version

$version[0] -eq $versionString

请注意,
$version[0]

,即返回的

first
对象,包含感兴趣的版本号,无需解决格式工件,例如尾随空格、标题行或空行。

© www.soinside.com 2019 - 2024. All rights reserved.