如何使用 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
、$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 这里给出了详细的原因。
将您在函数中解析的数据存储在一个对象中。
例如,改变这个...
$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
}
我还没有测试上面的代码,但希望它能有所帮助。
我用这个显示组中的所有用户:
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
、$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 这里给出了详细的原因。
将您在函数中解析的数据存储在一个对象中。
例如,改变这个...
$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
}
我还没有测试上面的代码,但希望它能有所帮助。