-and 比较是单独评估还是针对同一对象进行评估?

Is -and comparison evaluated individually or against the same object?

我正在寻找两个数组之间丢失的事件:$tc_records$RelationshipEvents_array。两个数组应具有相同的两个条目。

A​​->B 和反向 B->A 的条目。当我使用 -and 语句评估 RelationshipEvents 时,是否评估一个(相同)事件,或者 -and 的每一侧加载数组并独立评估。

foreach ($record in $tc_records) {
    # is this using the same RelationshipEvent for both comparisons or two different comparisons?
    if($RelationshipEvents_array.entity1Id -eq $record.entity1Id -and $RelationshipEvents_array.entity2Id -eq $record.entity2Id){
        $re_tc_matched_record.Add($record)
    } else {
        $re_tc_not_matched_record.Add($record)
    }    
}
in case this makes any difference:
Name                           Value
----                           -----
PSVersion                      6.2.3
PSEdition                      Core
GitCommitId                    6.2.3
OS                             Darwin 19.0.0 Darwin Kernel Version 19.0.0: Thu Oct 17 16:17:15 PDT 2019; root:xnu-6153.41.3~29/RELEASE_X86_64
Platform                       Unix
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

看起来你的两个数组包含具有不同属性的相似对象。 当您执行此操作时:

foreach ($record in $tc_records) {
    if($RelationshipEvents_array.entity1Id -eq $record.entity1Id -and $RelationshipEvents_array.entity2Id -eq $record.entity2Id)
...

您实际上是在比较一个包含所有 entity1Id 属性的数组(通过从 $RelationshipEvents_array 数组中的每个对象中获取该名称的 属性 来计算)与当前 $record 对象的 entity1Id 属性。

除非我误解了你的问题,否则鉴于不同的对象类型,这不太可能评估为真。

在进行这样的比较时,我通常会做如下类似的事情来获得匹配:

if($RelationshipEvents_array.entity1Id -contains $record.entity1Id)
...

但是,由于您要匹配两个属性,最简单的方法可能是:

在第二个 foreach 循环中为您检查的每条记录迭代数组

foreach ($record in $tc_records) {
    foreach ($event in $RelationshipEvents_array) {
        if ($record.entity1Id -eq $event.entity1Id -and $record.entity2Id -eq $event.entity2Id)
{ # Do matchy stuff
...

您确实有比较对象 cmdlet 可以为您进行数组比较,并且有很多选项可以输出数组之间的不匹配对象。

$a1=@(1,2,3,4,5)
$b1=@(1,2,3,4,5,6)

Compare-Object -ReferenceObject $a1 -DifferenceObject $b1

虽然要回答你的问题,-and 只是评估一个单独的第二个函数,该函数也必须等于 true 才能评估语句。

if (true){#runs}
if (false){#no runs}
if (true -and true){#runs}
if (true -and false){#no runs}
if (false -and true){#no runs}

您似乎在单独的数组上使用 -eq,没有示例数据很难准确判断,但您应该能够通过简单地执行 $RelationshipEvents_array.entity1Id -eq $record.entity1Id 并检查它是否 returns true 或 false 如您所料。如果 $RelationshipEvents_array 是一个数组,您可能想使用 -contains