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

时间:2017-07-25 20:38:49

标签: powershell foreach export-to-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?

4 个答案:

答案 0 :(得分:3)

您的功能输出为Write-output$Group,以及Get-ADGroupMember返回的对象。这个不同对象的集合使它无法由Export-CSV导出,但是可以通过Out-File导出文本文档。

如果要导出到csv,则需要使用要导出的属性创建一致对象的集合:

因此,我们会使用ForEach-Object循环遍历每个群组,并将群组成员资格存储在$members中。然后可以使用foreach循环遍历,这意味着我们仍然可以使用ForEach-Object$_循环中的信息来获取组的名称,以及$member中的用户信息{1}}并为每个用户创建一个对象,其中只包含[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所述,最佳做法是不将scriptblock与AD cmdlet上的过滤器一起使用。 His excellent answer这里详细说明原因。

答案 1 :(得分:0)

这个怎么样:

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

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

答案 2 :(得分:0)

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

答案 3 :(得分: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

}

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