2008-08-17 68 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設置爲get-member,則可以從命令行直接瀏覽對象模型。

重要的部分如下。

類型名:System.DirectoryServices.ResultPropertyCollection

名稱MemberType定義


值屬性System.Collections.ICollection值{獲得;}

0

我相信它與PS插入「」中的信息的方式有關。試試這個:

「的報價$服務器名稱($ _屬性)。名稱」

或者你甚至可能需要一個多集的$()。我現在不是我可以測試的地方。

0

關閉 - 下面的工作是正確的,但如果有人有更深入的解釋,我會感興趣。

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

因此,似乎$ _。properties.name不會像我預期的那樣順從。如果我正確可視化,名稱屬性是多值的事實導致它返回一個數組。這(我認爲)應該能解釋了以下工作:

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

如果「名」是一個字符串,應返回的第一個字符,而是因爲它是一個數組,它返回的第一個字符串。