我近期遇到了一個與我的腳本有關的常見問題,並決定將它扔到野外,看看其他人如何處理這個問題。導出具有不同屬性的對象的方法?
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-csv
或out-file
該文件是基於第一個對象基於足夠的標題生成的 - 所以它根據第一個對象具有的屬性數量創建標題。因此可以說第一個用戶有3個匹配的組,它將創建標題CtxGroup1, CtxGroup2, CtxGroup3
。大! 第
如果下一個用戶有5個匹配的組 - 只有前三個包含在輸出中,並且附加2被丟棄,因爲我們沒有CtxGroup4, CtxGroup5
的標題。
其他人怎麼處理這個問題呢?
旁註;我認爲創建我的第一個對象是一個具有大量對象(因此標題)的虛擬對象,但是很好 - 這並不酷,並且真的讓我感覺效率低下。
感謝JPBlanc。發佈後,我昨天來到了幾乎相同的解決方案。雖然你正確地使$計數器被棄用 - 我最初錯過了這一點。在這種情況下,我們都有很好的方法。但不適合具有兩個動態字段的對象(例如:NIC卡數*和* IP地址數)。也許是另一次的問題。 – SinFulNard