如何使用 Powershell 将 foreach 输出为 CSV?

How to output foreach into CSV using Powershell?

我用这个显示组中的所有用户:

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?

这个怎么样:

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

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

有两种输出到 CSV 的选项。使用 Export-CSV 将覆盖已经存在的文件。因此,您可以将所有内容放入变量并将其输出到 CSV,或者您可以将 -Append 添加到 Export-CSV cmdlet 调用。这将附加数据而不是覆盖它。

您的函数的输出是 Write-output$GroupGet-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 这里给出了详细的原因。

将您在函数中解析的数据存储在一个对象中。

例如,改变这个...

$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

}

我还没有测试上面的代码,但希望它能有所帮助。