我的环境中有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
}
5条答案
按热度按时间lc8prwob1#
这经常出现。-contains vs .contains()。他们很不一样。-contains必须完全匹配。但左边可以是字符串数组。你把所有的东西都放在左边的一个字符串中,用[字符串]转换。
ycl3bljg2#
来自MS文档
重要的部分是这里是“仅当测试值完全匹配”。在你的例子中,你试图将字符串“2016 2012 2008”与例如2016进行比较,这并不完全匹配。在这种情况下,应该使用
-like
运算符。或者将兼容OS变量定义为字符串数组,如[String[]]
,然后可以使用-contains
。另外,检查OSVersion变量中的内容。它是一个machtcollection而不是一个字符串。如果你将compatibleOS变量定义为一个字符串数组,并使用
$OSVersion.Value
,那么这两个例子都可以工作。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。
lrl1mhuk4#
对我来说下面的语法工作
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 }