Я что-то здесь упускаю:
$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
Когда вы включили $ _. 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;}
Я считаю, что это связано с тем, как PS интерполирует информацию в "". Попробуй это:
"Имя сервера в кавычках $ ($ _. Properties) .name"
Или вам может понадобиться еще один набор $ (). Я не где-то, что я могу проверить это прямо сейчас.
Закрыть - ниже работает правильно, но мне было бы интересно, если у кого-нибудь есть более глубокое объяснение.
PS C:\> $computers[0] | %{ "$_.properties.name"; "$($_.properties.name)" }
System.DirectoryServices.SearchResult.properties.name
GORILLA
Так что может показаться, что $ _. Properties.name не так уж и хорош, как я ожидал. Если я правильно визуализирую, тот факт, что свойство name является многозначным, заставляет его возвращать массив. Что (я думаю) объяснило бы, почему работает следующее:
$computers[0] | %{ $_.properties.name[0]}
Если «name» было строкой, это должно вернуть первый символ, но, поскольку это массив, оно возвращает первую строку.