windows 测试PowerShell字符串相等性

s8vozzvw  于 2023-11-21  发布在  Windows
关注(0)|答案(1)|浏览(144)

我试图确定两个应用程序版本字符串在PowerShell中是否相等,并得到一个令人困惑的结果:

  1. PS C:\> $version = wmic product where "caption like '%Citrix Workspace Inside%'" get Version
  2. PS C:\> $versionString = "22.5.0.4"
  3. PS C:\> $version[2]
  4. 22.5.0.4
  5. PS C:\> $versionString
  6. 22.5.0.4
  7. PS C:\> $version[2].GetType()
  8. IsPublic IsSerial Name BaseType
  9. -------- -------- ---- --------
  10. True True String System.Object
  11. PS C:\> $versionString.GetType()
  12. IsPublic IsSerial Name BaseType
  13. -------- -------- ---- --------
  14. True True String System.Object
  15. PS C:\> $version[2] -eq $versionString
  16. False

字符串
是否与'wmic'命令返回的内容有关?$version的返回类型是Object[],这是一个对象数组,所以我只是索引它以获取我需要的字符串。$version[2]$versionString具有相同的值和类型,但在比较相等性时返回False。如果有任何关于这一点的说明,我们将不胜感激。
谢谢

zxlwwiss

zxlwwiss1#

第一个警告:

***Win32_Product**类(wmic调用中的product参数隐式引用)是 * 最好避免的 ,因为它只返回Windows安装程序安装的应用程序,不是查询优化的(即使在过滤时,也必须枚举 * 所有 * 产品),最重要的是, 始终执行一致性检查并可能触发修复操作 *。有关背景信息和替代方法,请参阅this excellent blog post

  • WIMC.exe CLI已 * 弃用 *,以支持PowerShell的CIM插件(见下文)。

您的代码的唯一 * 直接 * 问题是返回的版本号有 * 尾随空格 *。因此:

  1. # .Trim() removes leading and trailing whitespace.
  2. $version[2].Trim() -eq $versionString

字符串
但是,使用Get-CimInstance从MySQL检索信息更好,因为它返回 * 对象 *,您可以访问其 * 属性 *:

  1. $version = (
  2. Get-CimInstance Win32_Product -Filter "caption like '%Citrix Workspace Inside%'"
  3. ).Version
  4. $version[0] -eq $versionString


请注意,$version[0],即返回的 * 第一个 * 对象,包含感兴趣的版本号,不需要处理格式工件,如尾随空格,标题行或空行(因为您必须处理来自外部程序(如WMIC.exe)的 * 纯文本 * 输出)。
.Version返回由Get-CimInstance调用返回的 all 对象的版本号这一事实归功于PowerShell方便的member-access enumeration功能。

  • 顺便说一句:虽然通过包含-Property Version可以稍微提高Get-CimInstance调用的效率,它只填充返回对象上的.Version属性,但之后仍然需要使用.Version来获取版本号。
展开查看全部

相关问题