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

cedebl8k  于 2023-06-29  发布在  Shell
关注(0)|答案(5)|浏览(189)

我的环境中有PowerShell版本3、4和5。当我写下面的代码时,它不断地给我false,尽管$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
 }
lc8prwob

lc8prwob1#

这经常出现。-contains vs .contains()。他们很不一样。-contains必须完全匹配。但左边可以是字符串数组。你把所有的东西都放在左边的一个字符串中,用[字符串]转换。

$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
ycl3bljg

ycl3bljg2#

来自MS文档

  • 包含说明:安全壳操作员。指示参考值的集合是否包含单个测试值。始终返回布尔值。仅当测试值与至少一个引用值完全匹配时,才返回TRUE。
    重要的部分是这里是“仅当测试值完全匹配”。在你的例子中,你试图将字符串“2016 2012 2008”与例如2016进行比较,这并不完全匹配。在这种情况下,应该使用-like运算符。或者将兼容OS变量定义为字符串数组,如[String[]],然后可以使用-contains
    另外,检查OSVersion变量中的内容。它是一个machtcollection而不是一个字符串。如果你将compatibleOS变量定义为一个字符串数组,并使用$OSVersion.Value,那么这两个例子都可以工作。
qgelzfjb

qgelzfjb3#

虽然$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
->True
注意,最后一个返回true是由于同一个示例,而其余的都是false。因此,当使用-contains时,您将收到False。但是,当您使用contains(..)格式时,它不会检查相同的示例,因此在您的情况下返回True。

lrl1mhuk

lrl1mhuk4#

对我来说下面的语法工作

ForEach ($content in $logFileContent) {
  
     if( $content.contains("MainClass")){
       echo  "MainClass: $content" >> $log
           }
         }
vjrehmav

vjrehmav5#

$datepoint =“MAIN_20230601”$accountingTypesArray =“AccruedExternalInterest”,“AccruedInternalInterest”,“AccruedFee”,“BookedExternalInterest”,“BookedInternalInterest”,“BookedFee”foreach($item in $accountingTypesArray){ $finalUrl =“https://encx-eodd-syst.danskenet.net/api/Delivery/Trigger?accountingPoint=“+$datepoint+"&productSystem=WSO&accountingType="+$item $response = Invoke-RestMethod $finalUrl -Method 'GET' Write-Output $response.slideshow }

相关问题