当前位置: 首页 > 知识库问答 >
问题:

具有对象集合的PowerShell包含运算符

段干华晖
2023-03-14

当在PowerShell中对对象集合(在本例中,由ActiveDirectory模块commandlet创建)使用包含运算符(例如,-contains,-notcontains,,-in)时,我没有观察到预期的结果。操作符似乎无法检测到集合中我确定匹配的对象。

在下面的例子中,我甚至使用了compare-object commandlet来证明元素确实是匹配的。


$PSVersionTable | Format-Table

$adusers_list = (get-aduser -id fooboss -properties directreports).directreports |%{ Get-ADUser -Identity $PSItem } 

$target_aduser = get-aduser -id jrw 


# This use of containing operators seems very similar to the example presented in documentation:
# https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_comparison_operators?view=powershell-6#containment-operators
# Here comes the unexpected results:
$adusers_list -contains $target_aduser

$target_aduser -in $adusers_list 

#And yet...
$adusers_list |%{
    if ($_.samaccountname -eq "jrw") {
        write-output "Contrary to what the contains operators told us, here it is: $($_.samaccountname)"
        Write-output "also, compare-object says:"
        compare-object $_ $target_aduser
    }
}

输出是:



Name                           Value                                                                                                                                                      
----                           -----                                                                                                                                                      
PSVersion                      5.1.18362.145                                                                                                                                              
PSEdition                      Desktop                                                                                                                                                    
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}                                                                                                                                    
BuildVersion                   10.0.18362.145                                                                                                                                             
CLRVersion                     4.0.30319.42000                                                                                                                                            
WSManStackVersion              3.0                                                                                                                                                        
PSRemotingProtocolVersion      2.3                                                                                                                                                        
SerializationVersion           1.1.0.1                                                                                                                                                    


False
False
Contrary to what the contains operators told us, here it is: jrw
also, compare-object says:

PS C:\WINDOWS\system32> 

我意识到我可以遍历并手动比较一组属性,如果我不能学习使用包含操作符的正确方法,我会这样做,但我会首先尝试这样做。

操作员文档似乎没有特别提到object类型的元素。它确实使用了“引用值”一词,所以这可能意味着它必须是一个简单的数据类型?但是如果是这样的话,文档中难道不应该提到这一点吗?也许PS也会为不可比较的类型抛出某种软异常?

共有1个答案

葛越泽
2023-03-14

您正在将复杂对象与简单值进行比较。您需要比较等效的对象类型。作为一个示例,请将您的比较逻辑更改为:

($adusers_list | Select -Expand samaccountname) -contains $target_aduser.samaccountname

这有效地将AD用户列表转换为字符串[],其中包含$adusers列表中用户的$adusers帐户名。然后,我们比较等效值($target_user.samaccountname),以查看该字符串值是否包含在比较的字符串 [] 中。

 类似资料:
  • 如果集合包含具有特定属性值的元素,我想断言(使用JUnit,而不是任何其他依赖项,如hamcrest)。 我发现这个问题如何断言迭代包含具有特定属性的元素?使用危害冠。 一种选择是重写< code>equals方法,只检查我想要比较的属性,但这不是一个好的解决方案。 有没有一种优雅的方法可以使用JUnit 4来实现这一点,或者我应该对其进行编码并循环访问集合以检查值?

  • 问题内容: 我想找到在其标签集中包含 所有 给定标签的项目。 以下是简化的类: 如果我这样尝试 我得到包含 任何 给定标签的项目。这不足为奇,但我希望包含 所有 给定标签的项目。所以我尝试另一种方式: 我收到错误消息。如果仅包含一个标签,它将起作用,但失败的原因不止于此。 如何在JPQL中表达呢? 问题答案: 诀窍是使用计数:

  • 我有这两个类,它们都有一个项目列表,我试图返回一个新对象“ItemWithDiscount”,它具有这两个类的属性,这在服务/控制器申请中。我尝试用流映射它们,但没能做到。谁能给我一个简单的方法来做这件事吗?

  • 问题内容: 我有两个Hibernate数据对象。第一个是用户(具有唯一的ID,用户名等),第二个是Collaborateable类。在这两者之间存在n对m的关系(带有Set的实现)。这意味着,一个用户使用许多可协作对象,而一个可协作对象具有许多用户。另外,一个可协作对象只有一个用户作为所有者。 我想实现一个Hibernate查询,该查询搜索具有特定用户作为所有者或在Collaborateable.

  • 问题内容: 我想找到在其标签集中包含 所有 给定标签的项目。 以下是简化的类: 如果我这样尝试 我得到包含 任何 给定标签的项目。这不足为奇,但我希望包含 所有 给定标签的项目。所以我尝试另一种方式: 我收到错误消息。如果仅包含一个标签,它将起作用,但失败的原因不止于此。 如何在JPQL中表达呢? 问题答案: 诀窍是使用计数:

  • 问题内容: 我在用Maven或Eclipse编译一些Scala时遇到问题,我尝试从Java jar导入一个包含名称空间和同名类的类。 我可以用编译。 例如,Java项目(jar)包含: 编译器抱怨: 在Scala 2.9.0.1(和)中使用Maven 3.0.03 / Eclipse 3.7.1 。 我遇到问题的jar是-它肯定包含几个实例,其中存在同名的名称空间和对象。 我正在尝试在Scala中