PowerShell 中的对象相等标准是什么?ServiceController 如何定义 Equals 方法?

What is the object equality standard in PowerShell and how does ServiceController define the Equals method?

我在 PowerShell 中尝试了这些命令:

$a1 = (Get-Service)
$a2 = (Get-Service)
$a1[0] -eq $a2[0]

令我惊讶的是,结果是错误的。然后我仔细检查了它们的值,发现它们是相同的服务。

属于同一服务的两个对象怎么可能不相等?

PowerShell 中的对象相等标准是什么?

我发现一部分原因是因为 System.ServiceProcess.ServiceController Object returns 中的方法 Equals false.

但是系统比较怎么样呢?这是我现在不明白的。

它们不是同一个对象。它们可能包含相同的数据,但它们是ServiceController的不同实例 ] 对象。

举个例子:

$obj = new-object pscustomobject -Property @{123=456}
$obj2 = new-object pscustomobject -Property @{123=456}

您认为这些是相同的对象吗?尽管它们包含相同的数据,但它们是两个独立的实例,因此 $obj1 -eq $obj2 将始终 return $false

同样,使用 .NET System.Object 中的 equals() 方法,一切都继承自该方法:

> $obj.equals($obj2)
False

我找到了一部分原因。那是因为 Equals 方法 System.ServiceProcess.ServiceController returns 的错误值。