2017-07-25 163 views
1

我顯示所有用戶的組在此:如何使用Powershell將foreach輸出爲CSV?

Import-Module ActiveDirectory 

$Groups = Get-ADGroup -Filter {name -like "UC_*"} | Select -ExpandProperty Name # UC_* is my group 

foreach ($Group in $Groups){ 
Write-Output "Group" 
Write-Output "-----" 
$Group 
Write-Output "" 
Get-ADGroupMember -Identity $Group | select -Property Name, samaccountname 
Write-Output "" 
} 

我想其輸出到一個CSV但是當我做,它看起來像每一行由下一行的循環覆蓋掉了所以有CSV中沒有數據。這是行不通的:

# Get users in a group or groups 

Import-Module ActiveDirectory 


Function Get-Users { 
    $Groups = Get-ADGroup -Filter {name -like "UC_*"} | Select -ExpandProperty Name # UC_* is my group 

    foreach ($Group in $Groups){ 
    Write-Output "Group" 
    Write-Output "-----" 
    $Group 
    Write-Output "" 
    Get-ADGroupMember -Identity $Group | select -Property Name, samaccountname 
    Write-Output "" 
    } 
} 

Get-Users | export-csv "c:\temp\myfile.csv" 

如何正確輸出所有內容到CSV?

+1

順便說一句:使用腳本塊('{...}')作爲'-Filter'說法 - 儘管它在這種情況下_particular_ - 是一個壞主意;看到[這個答案](https://stackoverflow.com/a/44184818/45375)(我的)。 – mklement0

回答

3

函數的輸出是Write-output的,$Group,以及從Get-ADGroupMember返回的對象。這種不同對象的集合使其無法通過Export-CSV導出,但是會通過Out-File用於文本文檔。

如果要導出爲CSV,你需要創建的屬性相一致的對象的集合要導出:

所以我們會遍歷各組ForEach-Object,並存儲組成員在$members。然後可以遍歷與foreach,這意味着我們仍然可以使用從$_ForEach-Object循環的信息來獲得組的名稱,並在$member用戶信息,並創建一個對象,爲每個用戶只這就是信息通過使[pscustomobject]

Get-ADGroup -Filter "name -like 'UC_*'" | 
    ForEach-Object { 
     $members = Get-ADGroupMember $_ 
     foreach ($member in $members) { 
      [pscustomobject]@{ 
       "Group Name"  = $_.Name 
       "SamAccountName" = $member.SamAccountName 
       "User Name"  = $member.name 
      } 
     } 
    } | 
    Export-Csv "c:\temp\myfile.csv" 

還提到@ mklement0需要,這是不腳本塊的使用與在AD cmdlet的過濾器的最佳實踐。 His excellent answer這裏給出詳細的原因。

0

如何:

$Groups = Get-ADGroup -Filter {name -like "UC_*"} | Select -ExpandProperty Name # UC_* is my group 

$Groups | Export-Csv "c:\temp\myfile.csv" -NoTypeInformation 
0

有輸出到CSV兩種選擇。使用Export-CSV將覆蓋已存在的文件。所以,你可以把一切都變成一個變量,並輸出到CSV或您可以添加-AppendExport-CSV cmdlet的電話。這將附加數據而不是覆蓋它。

+0

我確實想覆蓋它。 – Prox

0

商店你在你的函數中的對象分析數據。

例如,改變了...

$Groups = Get-ADGroup -Filter {name -like "UC_*"} | Select -ExpandProperty Name # UC_* is my group 

foreach ($Group in $Groups){ 
Write-Output "Group" 
Write-Output "-----" 
$Group 
Write-Output "" 
Get-ADGroupMember -Identity $Group | select -Property Name, samaccountname 
Write-Output "" 

...到這樣的事情...

$users = @() 

$groups = Get-ADGroup -Filter {name -like "UC_*"} | Select -ExpandProperty Name 

$groups | % { 

    $group | New-Object System.Object 
    $group | Add-Member -MemberType NoteProperty -Name GroupName -Value $_ 

     Get-ADGroupMember -Identity $_ | Select -Property Name, samaccountname | % { 

$group | Add-Member -MemberType NoteProperty -Name MemberName -Value $_.Name 
$group | Add-Member -MemberType NoteProperty -Name samaccountname -Value $_.samaccountname 


} 


    $users += $group 

} 

我沒有測試上面的代碼,但希望它幫助。

+0

我想你會碰到一個問題,'$ group.members'將會是一個對象而不是字符串。解決方案可能是使用「Out-String」或爲每個用戶創建一個對象。只能用'Export-CSV'輸出 – BenH

+0

好點。我做了進一步的編輯,試圖照顧這一點,雖然它搞砸了格式化,我不知道如何解決它。有沒有辦法看到底層的代碼塊標記? – ZenoArrow