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

时间:2019-07-08 08:16:07

标签: 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
   }

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

 [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
 }

3 个答案:

答案 0 :(得分:2)

尽管$ CompatiableOS包含$ OSverions的输出,但是-contains仅用于单个测试值,并且在测试值与至少一个参考值完全匹配时返回true。  但是,当测试值是一个集合时,Contains运算符将使用引用相等性。仅当参考值之一是测试值对象的相同实例时,它才返回TRUE。重要的是,在这种情况下,它们必须是同一实例。 例如:

PS>“ abc”,“ def”,“ ghi”-包含“ abc”,“ def”

->错误

PS> $ a =“ abc”,“ def”

PS>“ abc”,“ def”,“ ghi”-包含$ a

->错误

PS> $ a,“ ghi”-包含$ a

->真

注意,由于相同的实例,最后一个返回真,其余为假。因此,在使用-contains时,您会收到False。 但是,当您使用contains(..)格式时,它不会检查同一实例,因此在您的情况下返回True。

答案 1 :(得分:2)

这经常出现。 -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

答案 2 :(得分:0)

摘自MS文档

  

-包含         描述:遏制运算符。告诉是否收集参考         值包括一个测试值。始终返回布尔值。返回TRUE         仅当测试值与至少一个参考值完全匹配时。

重要的部分是“ 仅在测试值完全匹配时”。在您的情况下,您尝试将字符串“ 2016 2012 2008”与示例2016进行比较,这并不完全匹配。在这种情况下,您应该使用<select class="form-control" [(ngModel)]=id name="assetID"> <option *ngFor="let asset of arrAssets" selected> <input type="hidden" value="{{ asset.Id }}" name="id"> {{ asset.Name }} </option> </select> 运算符。或者,您将compatibleOS变量定义为类似于-like的字符串数组,则可以使用[String[]]

附加,检查OSVersion变量中的内容。它是一个machtcollection而不是字符串。如果您将compatibleOS变量定义为字符串数组,并且使用-contains,那么两个示例都将起作用。