使用powershell检查字符串列表中是否存在字符串

coo*_*lRV 6 powershell

我的环境中有 Powershell 版本 3,4 和 5。当我编写下面的代码时,它不断给我错误,尽管 $CompatiableOS 包含 $OSverions 的输出。

   [string] $CompatiableOS = '2016','2012','2008'
   $OSVersion=[regex]::Matches(((Get-WmiObject -class Win32_OperatingSystem).caption), "([0-9]{4})")

   if ( $CompatiableOS -contains  $OSVersion)
   {
      return $TRUE
   }
   else
   {
      return $FALSE
   }
Run Code Online (Sandbox Code Playgroud)

但是当我将上面的代码更改为下面时,它起作用了。可能是什么问题?

 [string] $CompatiableOS = '2016','2012','2008'
 $OSVersion=[regex]::Matches(((Get-WmiObject -class Win32_OperatingSystem).caption), "([0-9]{4})")

 if ( $CompatiableOS.contains($OSVersion))
 {
    return $TRUE
 }
 else
 {
      return $FALSE
 }
Run Code Online (Sandbox Code Playgroud)

js2*_*010 13

这出现了很多。-contains 与 .contains()。他们非常不同。-contains 必须完全匹配。但左侧可以是一个字符串数组。实际上,您使用 [string] 演员表将所有内容连接到左侧的一个字符串中。

$compatibleos
'2016 2012 2008'

'2016 2012 2008' -contains '2016'
False

'2016 2012 2008'.contains('2016')
True

'2016','2012','2008' -contains '2016'
True

('2016','2012','2008').contains('2016')
True
Run Code Online (Sandbox Code Playgroud)


小智 8

来自微软文档

-包含描述:收容操作员。判断参考值集合是否包含单个测试值。始终返回布尔值。仅当测试值与至少一个参考值完全匹配时才返回 TRUE。

这里重要的部分是“仅当测试值完全匹配时”。在您的情况下,您尝试将字符串“2016 2012 2008”与示例 2016 进行比较,这并不完全匹配。在这种情况下,您应该使用-like运算符。或者您将兼容操作系统变量定义为类似的字符串数组[String[]],然后您可以使用 -contains.

另外,检查 OSVersion 变量中的内容。它是一个machtcollection而不是一个字符串。如果您将兼容操作系统变量定义为字符串数组并且使用$OSVersion.Value两个示例都将起作用。