我的环境中有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
}
答案 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
,那么两个示例都将起作用。