引用 System.DirectoryServices.ResultPropertyCollection

Posted

技术标签:

【中文标题】引用 System.DirectoryServices.ResultPropertyCollection【英文标题】:quoting System.DirectoryServices.ResultPropertyCollection 【发布时间】:2010-09-06 00:55:48 【问题描述】:

我在这里遗漏了一些东西:

$objSearcher = New-Object System.DirectoryServices.DirectorySearcher  
$objSearcher.SearchRoot = New-Object System.DirectoryServices.DirectoryEntry  
$objSearcher.Filter = ("(objectclass=computer)")  
$computers = $objSearcher.findall()  

那么问题是为什么以下两个输出不同?

$computers | % 
"Server name in quotes $_.properties.name" 
"Server name not in quotes " + $_.properties.name 

PS> $computers[0] | %"$_.properties.name"; $_.properties.name
System.DirectoryServices.SearchResult.properties.name
GORILLA

【问题讨论】:

【参考方案1】:

当您在字符串中包含 $_.properties.name 时,它​​会返回属性的类型名称。当一个变量包含在一个字符串中并且对该字符串求值时,它会对该变量引用的对象调用 ToString 方法(不包括之后指定的成员)。

在这种情况下,ToString 方法返回类型名称。您可以强制对变量和成员进行评估,类似于 EBGreen 的建议,但使用

"Server name in quotes $($_.properties.name)"  

在另一种情况下,PowerShell 正在评估首先指定的变量和成员,然后将其添加到前一个字符串中。

你是对的,你正在取回一组属性。如果您通过管道将 $computer[0].properties 传递给 get-member,则可以直接从命令行探索对象模型。

重要的部分如下。

类型名称:System.DirectoryServices.ResultPropertyCollection

名称 MemberType 定义


Values 属性 System.Collections.ICollection 值 get;

【讨论】:

【参考方案2】:

我认为这与 PS 在“”中插入信息的方式有关。试试这个:

"引号中的服务器名称 $($_.properties).name"

或者您甚至可能还需要一组 $()。我现在不是可以测试它的地方。

【讨论】:

【参考方案3】:

关闭-- 下面的工作正常,但如果有人有更深入的解释,我会很感兴趣。

PS C:\> $computers[0] | % "$_.properties.name"; "$($_.properties.name)" 
System.DirectoryServices.SearchResult.properties.name
GORILLA

所以看起来 $_.properties.name 并没有像我预期的那样顺从。如果我正确地可视化,那么 name 属性是多值的这一事实会导致它返回一个数组。哪个(我认为)可以解释为什么以下工作:

$computers[0] | % $_.properties.name[0]

如果“name”是一个字符串,它应该返回第一个字符,但是因为它是一个数组,所以它返回第一个字符串。

【讨论】:

以上是关于引用 System.DirectoryServices.ResultPropertyCollection的主要内容,如果未能解决你的问题,请参考以下文章

Java四种引用包括强引用,软引用,弱引用,虚引用

强引用,软引用,弱引用,虚引用

强引用软引用弱引用虚引用以及他们之间和 gc 的关系

强引用弱引用软引用虚引用

java强引用 软引用 弱引用 虚引用

强引用,软引用,弱引用,幻想引用有什么区别