引用 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的主要内容,如果未能解决你的问题,请参考以下文章