> $a1
Hash
----
9045345C8B84BFC1271FACC4CAE8A145263028C2ECD6F558BEAE841DD3BD116
> $a2
Hash
----
9045345C8B84BFC1271FACC4CAE8A145263028C2ECD6F558BEAE841DD3BD116
> $a1 -eq $a2
False
当Hash属性明显相同时,为什么会给出false?
使用 -like
可以,但是,我不知道是否推荐使用 -eq
。
最佳答案
当您执行 $a1 -eq $a2
时,您要比较的是具有名为 Hash
属性的 2 个对象,您要做的是比较两个对象上的 Hash
属性的值,您可以使用成员访问运算符 .
扩展这些属性的值。请参阅about Properties .
$a1 = [pscustomobject]@{
Hash = '9045345C8B84BFC1271FACC4CAE8A145263028C2ECD6F558BEAE841DD3BD116'
}
$a2 = [pscustomobject]@{
Hash = '9045345C8B84BFC1271FACC4CAE8A145263028C2ECD6F558BEAE841DD3BD116'
}
$a1.Hash -eq $a2.Hash # True
PSObject
没有实现IEquatable
因此,当测试这两个对象是否相等时,默认值为 Object.ReferenceEquals(Object, Object)
这些对象具有不同的引用,因此 $false
。
为什么-like
返回$true
?
本质上,操作的右侧(本例中为 $a2
)作为 pattern
参数传递给 WildcardPattern
API将对象强制转换为字符串:
@{Hash=9045345C8B84BFC1271FACC4CAE8A145263028C2ECD6F558BEAE841DD3BD116}
然后将其与 $a1
进行比较,当两者都强制转换为字符串时,它们看起来完全相同。
$pattern = [WildcardPattern]::new(
[string] $a2,
[System.Management.Automation.WildcardOptions] 'CultureInvariant, IgnoreCase')
$pattern.IsMatch($a1) # True
关于PowerShell 比较运算符抛出错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76176483/