цитирование System.DirectoryServices.ResultPropertyCollection - PullRequest
1 голос
/ 17 августа 2008

Я что-то здесь упускаю:

$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

Ответы [ 3 ]

1 голос
/ 18 августа 2008

Когда вы включили $ _. Properties.name в строку, она возвращала имя типа свойства. Когда переменная включается в строку и строка оценивается, она вызывает метод ToString для этого объекта, на который ссылается переменная (не включая члены, указанные после).

В этом случае метод ToString возвращает имя типа . Вы можете форсировать оценку переменной и членов, аналогично предложенному EBGreen, но с помощью

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

В другом сценарии PowerShell сначала оценивает указанную переменную и члены, а затем добавляет ее в предыдущую строку.

Вы правы, что возвращаете коллекцию свойств. Если вы передадите $ computer [0] .properties в get-member, вы можете исследовать объектную модель прямо из командной строки.

Важная часть ниже.

TypeName: System.DirectoryServices.ResultPropertyCollection

Имя MemberType Определение


Значения Свойство System.Collections.ICollection Значения {get;}

0 голосов
/ 17 августа 2008

Закрыть - ниже работает правильно, но мне было бы интересно, если у кого-нибудь есть более глубокое объяснение.

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

Так что может показаться, что $ _. Properties.name не так, как я ожидал. Если я правильно визуализирую, тот факт, что свойство name является многозначным, заставляет его возвращать массив. Что (я думаю) объяснит, почему работает следующее:

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

Если «имя» было строкой, это должно вернуть первый символ, но, поскольку это массив, оно возвращает первую строку.

0 голосов
/ 17 августа 2008

Я считаю, что это связано с тем, как PS интерполирует информацию в "". Попробуйте это:

"Имя сервера в кавычках $ ($ _. Properties) .name"

Или вам может понадобиться еще один набор $ (). Я не где-то, что я могу проверить это прямо сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...