我试图确定 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。对此的任何说明将不胜感激。
谢谢
首先,警告:
Win32_Product
WMI 类是最好避免,因为它仅返回 Windows Installer 安装的应用程序,并且未进行查询优化(即使在过滤时,也必须枚举所有产品),并且 - 最重要的是 - 始终执行一致性检查并可能触发修复操作。有关背景信息和替代方案,请参阅这篇优秀的博客文章。您的代码的唯一立即问题是返回的版本号有尾随空格。
$version[2].Trim() -eq $versionString
但是,最好使用 Get-CimInstance
$version = (
Get-CimInstance Win32_Product -Filter "caption like '%Citrix Workspace Inside%'"
).Version
$version[0] -eq $versionString
请注意,
$version[0]
,即返回的
first对象,包含感兴趣的版本号,无需解决格式工件,例如尾随空格、标题行或空行。