система цитирования.Каталог сервисов.Коллекция результатов
-
08-06-2019 - |
Вопрос
Я здесь чего-то не понимаю:
$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 сначала вычисляет указанную переменную и элементы, а затем добавляет ее к предыдущей строке.
Вы правы в том, что возвращаете коллекцию свойств.Если вы трубите $компьютер[0].свойства чтобы получить-member, вы можете изучить объектную модель прямо из командной строки.
Важная часть приведена ниже.
Имя типа:Система.Каталог сервисов.Коллекция результирующих свойств
Определение типа элемента имени
Система ценностей.Коллекции.Значения ICollection {получить;}
Другие советы
Я полагаю, что это связано с тем, как 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" было строкой, это должно было бы возвращать первый символ, но поскольку это массив, он возвращает первую строку.