система цитирования.Каталог сервисов.Коллекция результатов

StackOverflow https://stackoverflow.com/questions/13753

Вопрос

Я здесь чего-то не понимаю:

$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" было строкой, это должно было бы возвращать первый символ, но поскольку это массив, он возвращает первую строку.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top