2014-10-20 69 views
1

我試圖通過用戶的列表進行迭代,所以我可以拉它們的屬性,但我是相當新的PowerShell和不理解我得到的輸出。PowerShell的的foreach

foreach ($user in $AllUsers) 
{ 
    get-member -inputobject $user; 
    write-host " " 
} 

$AllUsers對象有六個用戶,每個用戶都有一組屬性和方法。然而,當我運行上面的代碼塊時,輸出爲6個空行,則屬性和方法爲每個用戶連續六次的列表。我試圖讓每個用戶的屬性和方法由一個空行分隔出來。有人可以幫助我瞭解爲什麼輸出運行write-host 6次,然後get-member六倍?

回答

2

我認爲正在發生的事情是,Get-Member結果得到放入管道和排隊等候直至該塊完成。相反,Write-Host的副作用正在每個循環中立即發生。您可以通過寫入字符串輸出來解決此問題:

foreach($user in $AllUsers) 
{ 
    $user | gm | out-string 
} 

這將打印每個項目的成員,其間有一些空格。大多數情況下,給定類型的所有對象都具有相同的成員,但偶爾會有動態定義的成員。

+0

如果由於某種原因必須使用寫主機來添加內容,這也將按照所需的順序打印 – Paul 2014-10-20 17:47:31

+0

這正是我需要知道的。謝謝。 – Karl 2014-10-20 20:48:11

1

它的行爲這種方式,因爲你告訴它太:)

當您使用的foreach,你是做什麼的在代碼塊的每個項目集合($ AllUsers的)英寸因此,對於每個用戶,首先得到一個get-member,然後write-host寫一個空行。

你爲什麼要寫出每個用戶的屬性和方法?他們將是相同的。

如果你只是想列出的用戶,你可以做到這一點的所有屬性:

$AllUsers | format-list * 

然後你就可以看到所有屬性,當你已經決定要顯示哪一個,你可以選擇只查看那些:

$AllUsers | Select-Object Prop1,Prop2,Prop4,Prop10 
+0

有可能是由電源加在每個對象上不同的部件殼牌的擴展型系統。這些可以通過Add-Member cmdlet添加。 – 2014-10-20 16:23:30

+0

哈哈我還沒有在Powershell的擴展類型級別。最終,我試圖從一個AD中提取用戶列表並將它們插入另一個。我意識到每個用戶的屬性和方法列表都是相同的,所以這個特定命令的輸出並不是必需的,但是當我試圖構建我的循環來提取屬性時,我碰到了這個並且它把我扔了一圈,可以這麼說。我將要使用ojk的Select-Object,但它看起來非常有用。 – Karl 2014-10-20 20:45:29

1

Get-Member寫入成功輸出流,而Write-Host寫入控制檯(或更確切地說是主機程序)。不能保證以相應語句的運行順序顯示不同的輸出。當語句將輸出寫入成功輸出流以及錯誤輸出流(或其他輸出流之一,如警告或調試)時,您也可以獲得此行爲。有關PowerShell中輸出的更全面討論,請參見here

如果你希望每個組對象的成員後打印一個空行,用Write-Output替換Write-Host

foreach ($user in $AllUsers) { 
    Get-Member -InputObject $user 
    Write-Output '' 
} 

你也可以做這樣的事情:

foreach ($user in $AllUsers) { 
    (Get-Member -InputObject $user) + '' 
} 

或像這樣:

$AllUsers | % { (Get-Member -InputObject $_) + '' } 
+0

這非常有幫助。你和邁克z都是對的,但我給了他正確的答案,因爲它是第一位的。 – Karl 2014-10-20 20:46:00