Сведения о вопросе

Getthesound

05:54, 16th August, 2020

Теги

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

Просмотров: 449   Ответов: 3

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

$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



  Сведения об ответе

+-*/

04:53, 2nd August, 2020

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

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

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

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

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

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

TypeName: System.DirectoryServices.ResultPropertyCollection

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


Ценности Собственность System.Collections.ICollection значения {get;}


  Сведения об ответе

piter

22:32, 16th August, 2020

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

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

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


  Сведения об ответе

padenie

21:06, 1st October, 2020

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

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

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться