2008-08-17 7 views
1

я что-то здесь отсутствует:квотирование 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 

ответ

1

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

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

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

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

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

Важная часть приведена ниже.

TypeName: System.DirectoryServices.ResultPropertyCollection

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


Значение свойства System.Collections.ICollection значение {получить;}

0

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

"Имя сервера в кавычках $ (. $ _ Свойства) .name"

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

0

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

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

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

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

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