2012-11-20 59 views
0

我近期遇到了一個與我的腳本有關的常見問題,並決定將它扔到野外,看看其他人如何處理這個問題。導出具有不同屬性的對象的方法?

tl; dr;我想導出具有不同數量屬性的對象。例如;對象1可能有3個IP地址,但對象2有7個IP地址。

我已經發展到創建自定義屬性的新對象,然後這些對象注入到一個數組作爲我的捕結果的方法 - 高興地聽到,如果有更好的方法,但是這是我的風格。當輸出到屏幕時,此方法100%工作,因爲對象以列表格式顯示 - 我嘗試了一些導出/離開文件方法,但當我想要捕獲和存儲讀取輸出時,無法使用Excell 。

以下是我建立一個對象並存儲一個例子(代碼的功能在這裏並不重要 - 只要它產生的結果):

add-pssnapin Quest.ActiveRoles.ADManagement 
$Groups = get-qadgroup AmbigousGroupNameHere- 
$UserInfo = @() 

ForEach ($Group in $Groups) { 
    $CurrentGroupMembers = get-qadgroupmember $Group 
    write-host "Processing group:" $Group 
    ForEach ($GroupMember in $CurrentGroupMembers) { 
     If ($GroupMember.type -eq "User") { 
      $counter = 1 
      write-host "Processing member:" $GroupMember 
      $UserObject = get-qaduser $GroupMember | select SamAccountName,FirstName,LastName 

      $objUserInfo = New-Object System.Object 
      $objUserInfo | Add-Member -MemberType NoteProperty -Name SamAccountName -Value $UserObject.SamAccountName 
      $objUserInfo | Add-Member -MemberType NoteProperty -Name FirstName -Value $UserObject.FirstName 
      $objUserInfo | Add-Member -MemberType NoteProperty -Name LastName -Value $UserObject.LastName 

      $GroupMembership = get-qadgroup -ContainsMember $GroupMember | where name -like "AmbigousGroupNameHere-*" 

      ForEach ($GroupName in $GroupMembership) { 
       $objUserInfo | Add-Member -MemberType NoteProperty -Name CtxGroup$counter -Value $GroupName.SamAccountName 
       $counter++ 
      } 
      $UserInfo += $objUserInfo 
     } else { 
      write-host "This is a group - we are ignoring it." 
     } 
    } 
} 

$UserInfo | Export-Csv UsersOutput.csv -NoType 

從上面的 - 你可以看到我爲每個組縮放對象屬性名稱1。 CtxGroup$counter允許我縮放每個用戶擁有的正確組數的對象。默認情況下,輸出到屏幕時確認此功能很好。該對象已列出,並且我可以看到每個與該用戶匹配的組的新屬性。

現在的問題。當我export-csvout-file該文件是基於第一個對象基於足夠的標題生成的 - 所以它根據第一個對象具有的屬性數量創建標題。因此可以說第一個用戶有3個匹配的組,它將創建標題CtxGroup1, CtxGroup2, CtxGroup3。大!

如果下一個用戶有5個匹配的組 - 只有前三個包含在輸出中,並且附加2被丟棄,因爲我們沒有CtxGroup4, CtxGroup5的標題。

其他人怎麼處理這個問題呢?

旁註;我認爲創建我的第一個對象是一個具有大量對象(因此標題)的虛擬對象,但是很好 - 這並不酷,並且真的讓我感覺效率低下。

回答

0

你可以得到你想要的東西的屬性數量訂購$UserInfo陣列,這是可以做到的,但它不是那麼簡單的,你的情況我想補充另一個propertie與羣體的數量增加:

... 
ForEach ($GroupName in $GroupMembership) { 
       $objUserInfo | Add-Member -MemberType NoteProperty -Name CtxGroup$counter -Value $GroupName.SamAccountName 
       $counter++ 
      } 
$objUserInfo | Add-Member -MemberType NoteProperty -Name NbCtxGroup -Value ($counter - 1) 
$UserInfo += $objUserInfo 
... 

然後降序排列在這propertie數組:

$UserInfo | Sort-Object -Property NbCtxGroup -Descending | Export-Csv .\F.csv 

這不是那麼好,但它會做的伎倆。

看一看:

$objUserInfo.psobject.Properties | Measure-Object 
+0

感謝JPBlanc。發佈後,我昨天來到了幾乎相同的解決方案。雖然你正確地使$計數器被棄用 - 我最初錯過了這一點。在這種情況下,我們都有很好的方法。但不適合具有兩個動態字段的對象(例如:NIC卡數*和* IP地址數)。也許是另一次的問題。 – SinFulNard

相關問題