【问题标题】:How to output foreach into CSV using Powershell?如何使用 Powershell 将 foreach 输出到 CSV?
【发布时间】:2017-12-31 23:00:18
【问题描述】:

我正在显示一个组中的所有用户:

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?

【问题讨论】:

  • 顺便说一句:使用脚本块 ({...}) 作为 -Filter 参数 - 即使它适用于这种 特定 情况 - 是一个坏主意;见this answer(我的)。

标签: powershell foreach export-to-csv


【解决方案1】:

这个怎么样:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我确实想覆盖它。
    【解决方案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 这里详细说明了原因。

    【讨论】:

      【解决方案4】:

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

      例如,改变这个...

      $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
      
      }
      

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

      【讨论】:

      • 我想你会在这里遇到一个问题,$group.members 将是一个对象而不是字符串。解决方案可能是使用Out-String 或为每个用户创建一个对象。只有Export-CSV才能输出
      • 好点。我做了进一步的编辑来尝试解决这个问题,虽然它搞砸了格式,我不知道如何修复它。有没有办法查看底层代码块标记?
      猜你喜欢
      • 1970-01-01
      • 2016-07-11
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 2013-07-15
      • 2022-01-03
      • 2016-03-13
      • 1970-01-01
      相关资源
      最近更新 更多