我试图确定两个应用程序版本字符串在PowerShell中是否相等,并得到一个令人困惑的结果:
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。如果有任何关于这一点的说明,我们将不胜感激。
谢谢
1条答案
按热度按时间zxlwwiss1#
第一个警告:
***
Win32_Product
**类(wmic
调用中的product
参数隐式引用)是 * 最好避免的 ,因为它只返回Windows安装程序安装的应用程序,不是查询优化的(即使在过滤时,也必须枚举 * 所有 * 产品),最重要的是, 始终执行一致性检查并可能触发修复操作 *。有关背景信息和替代方法,请参阅this excellent blog post。WIMC.exe
CLI已 * 弃用 *,以支持PowerShell的CIM插件(见下文)。您的代码的唯一 * 直接 * 问题是返回的版本号有 * 尾随空格 *。因此:
字符串
但是,使用
Get-CimInstance
从MySQL检索信息更好,因为它返回 * 对象 *,您可以访问其 * 属性 *:型
请注意,
$version[0]
,即返回的 * 第一个 * 对象,包含感兴趣的版本号,不需要处理格式工件,如尾随空格,标题行或空行(因为您必须处理来自外部程序(如WMIC.exe
)的 * 纯文本 * 输出)。.Version
返回由Get-CimInstance
调用返回的 all 对象的版本号这一事实归功于PowerShell方便的member-access enumeration功能。-Property Version
可以稍微提高Get-CimInstance
调用的效率,它只填充返回对象上的.Version
属性,但之后仍然需要使用.Version
来获取版本号。