-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
我正在寻找两个数组之间丢失的事件:$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