цитирование System.DirectoryServices.ResultPropertyCollection

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

$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
17.08.2008 17:33:54
3 ОТВЕТА
РЕШЕНИЕ

Когда вы включили $ _. 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 Values ​​{get;}

1
10.09.2015 13:48:04

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

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

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

0
17.08.2008 17:41:14

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

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

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

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

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

0
17.08.2008 19:51:14