1

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

$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
4

3 回答 3

1

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

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

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

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

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

重要的部分如下。

类型名称:System.DirectoryServices.ResultPropertyCollection

名称 MemberType 定义


值属性 System.Collections.ICollection 值 {get;}

于 2008-08-17T22:10:02.907 回答
0

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

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

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

于 2008-08-17T17:41:14.103 回答
0

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

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

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

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

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

于 2008-08-17T19:37:45.070 回答