Powershell 和比较是单独评估还是针对同一对象评估?

Powershell 和比较是单独评估还是针对同一对象评估?,powershell,powershell-6.0,Powershell,Powershell 6.0,我正在寻找两个数组之间缺少的事件:$tc\u records&$RelationshipEvents\u数组。两个数组应具有相同的两个条目 A->B和反向B->A的一个条目。当我使用-and语句计算RelationshipEvents时,是否对一个(相同)事件进行计算,或者对-and语句的每一侧加载数组并独立进行计算 foreach ($record in $tc_records) { # is this using the same RelationshipEvent for both

我正在寻找两个数组之间缺少的事件:
$tc\u records
&
$RelationshipEvents\u数组
。两个数组应具有相同的两个条目

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)
    }    
}

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

foreach ($record in $tc_records) {
    if($RelationshipEvents_array.entity1Id -eq $record.entity1Id -and $RelationshipEvents_array.entity2Id -eq $record.entity2Id)
...
实际上,您正在将包含所有
entity1Id
属性的数组(通过从
$RelationshipEvents\u数组中的每个对象获取该名称的属性来计算)与当前
$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
...

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

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

Compare-Object -ReferenceObject $a1 -DifferenceObject $b1
为了回答您的问题,-和是一个单独的第二个函数,它也必须等于要计算的语句的
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\u array.entity1Id-eq$record.entity1Id
并检查它是否像您预期的那样返回true或false来测试您的逻辑。如果
$RelationshipEvents\u数组
是您可能要使用的数组
-包含

它是一个具有多个属性的复杂对象,afaik compare对象仅适用于字符串。我的cmdlet示例显示它适用于ints和powershells自己的cmdlet示例显示如何在多属性对象上使用它,例如由
get process
返回的对象。不管怎样,我回答的第二部分有帮助吗?如果仔细观察,您会发现在数组上使用
-eq
不会返回true或false,而是返回匹配的结果数组。我将再次查看。简单的示例如预期的那样返回,但当我加载完整的1000个对象集合时,一些结果返回为误报。所以我不确定是什么引起的。所有对象都已规格化此方法不起作用。此示例仅适用于单值字符串,每个if对象都有多个值,PS示例仅计算一个属性。这很简单:)这就是我想知道的。如果我对不同的集合执行两个独立的计算。问题是,在我的场景中,它们的计算结果是真实的。我有一个类似的嵌套循环,但有一个嵌套的
if
。。我想试试你的方法,希望去掉嵌套的if。我意识到,因为我在寻找丢失的事件,如果我执行嵌套循环,我可以在第一个属性上获得部分匹配,并且永远不会在第二个属性上找到部分匹配的值。所以我必须同时测试这两个属性。对不起,你能澄清一下你在哪里进行部分匹配吗?我不太明白。我打算添加另一种方法,使用索引和for循环同时检查这两个属性,但这有点复杂,所以我避免了它,但如果真的有必要,这可能是一种方法。我会尝试:)因此,我们得到消息,每条消息都有一对,这两条消息相互映射:message1id1->message2id2&message2id1->message1id2。到目前为止和我在一起?现在,所有这些消息都被另一个系统拾取并复制。系统1和系统2中各有一对。我的目标是在两个系统的两对中查找丢失的消息。是主发送者丢弃消息,还是两个系统之间的复制过程(或者甚至我们的日志系统都没有报告所有结果)
if (true){#runs}
if (false){#no runs}
if (true -and true){#runs}
if (true -and false){#no runs}
if (false -and true){#no runs}