带有管道 foreach 的 CSV 导出 PowerShell 脚本
CSV Export PowerShell Script with piped foreach
我使用以下 PowerShell 脚本获取所有应用程序和有权使用它们的用户。
现在我想将结果导出为 CSV,但它不起作用,我不知道为什么。
Add-PSSnapin Citrix*
asnp citrix*
Import-Module ActiveDirectory
$OutArray = @()
$OutArray += Get-BrokerApplication -AdminAddress *CITRIX DDC* | ForEach {
$name = $_.ApplicationName
$description = $_.Description
$assocgroups = $_.AssociatedUserNames
foreach ($group in $assocgroups) {
$result = $group -match '^*DOMAIN NAME*\(.+)$'
if ($result) {
$groupname = $Matches[1]
$members = Get-ADGroupMember -Identity "$groupname" -Recursive | Select Name,sAMAccountName,distinguishedName,mail
foreach ($member in $members) {
$result = $member.distinguishedname -match 'CN=.+,OU=Users,OU=(.+),OU=Department,DC=*DOMAIN NAME*,DC=de'
if (-not $result) {
# several exceptions from the default user DN exist for administrative users and/or service accounts
$result = $member.distinguishedname -match "CN=.+,(?:OU=Administrators,)?OU=(?:Administrators),OU=Infrastructure,DC=*DOMAIN NAME*,DC=de"
if (-not $result) {
$result = $member.distinguishedname -match "CN=.+,(?:OU=Testusers,)?OU=(?:Service Accounts),?OU=(?:Windows-Servers),OU=Infrastructure,DC=*DOMAIN NAME*,DC=de"
}
}
if ($result) {
$dept = $Matches[1]
Write-Host $member.Name";" $groupname";" $group";" $dept
} else {
throw "ERROR: User DN $($member.distinguishedName) does not match any known user departmental OU."
}
}
} else {
throw "Associated user names field does not match group standard naming scheme."
}
}
}
$OutArray | Export-Csv C:\temp\test.csv -NoTypeInformation
你的ForEach-Object
loop doesn't produce non-captured output on the Success output stream。因此,没有任何内容附加到 $OutArray
,因此,没有任何内容写入输出 CSV。
您通过
创建的输出
Write-Host $member.Name";" $groupname";" $group";" $dept
已写入主机控制台,无法捕获。您需要将其替换为 Write-Output
才能将输出写入 Succes 输出流(因此可以将其捕获在变量中或使用管道进行处理):
Write-Output $member.Name";" $groupname";" $group";" $dept
您也可以完全删除 cmdlet,因为写入输出流是 PowerShell 的默认行为,但仅适用于单个字符串,因此您需要 concatenante 元素:
$member.Name + ";" + $groupname + ";" + $group + ";" + $dept
但是,这仍然不会产生所需的 CSV 输出,因为 Export-Csv
需要对象输入并将对象的属性写入 CSV 的字段。如果为它提供一个以分号分隔的字符串数组,Export-Csv
将导出这些字符串对象 (Length
) 中唯一的 属性。
您可以使用 Out-File
或 Set-Content
(我不推荐)之类的 cmdlet 将以分号分隔的字符串列表写入输出文件:
$OutArray | Set-Content 'C:\temp\test.csv'
或者(更好)您可以在循环内构造适当的对象:
New-Object -Type PSObject -Property ([ordered]@{
Name = $member.Name
Groupname = $groupname
Group = $group
Department = $dept
})
并使用 Export-Csv
:
导出这些对象
$OutArray | Export-Csv 'C:\temp\test.csv' -Delimiter ';' -NoType
此外,由于 ForEach-Object
和 Export-Csv
都使用管道,您可以直接连接它们而无需先将输出收集到变量中:
Get-BrokerApplication -AdminAddress *CITRIX DDC* | ForEach-Object {
...
} | Export-Csv 'C:\temp\test.csv' -Delimiter ';' -NoType
我使用以下 PowerShell 脚本获取所有应用程序和有权使用它们的用户。 现在我想将结果导出为 CSV,但它不起作用,我不知道为什么。
Add-PSSnapin Citrix*
asnp citrix*
Import-Module ActiveDirectory
$OutArray = @()
$OutArray += Get-BrokerApplication -AdminAddress *CITRIX DDC* | ForEach {
$name = $_.ApplicationName
$description = $_.Description
$assocgroups = $_.AssociatedUserNames
foreach ($group in $assocgroups) {
$result = $group -match '^*DOMAIN NAME*\(.+)$'
if ($result) {
$groupname = $Matches[1]
$members = Get-ADGroupMember -Identity "$groupname" -Recursive | Select Name,sAMAccountName,distinguishedName,mail
foreach ($member in $members) {
$result = $member.distinguishedname -match 'CN=.+,OU=Users,OU=(.+),OU=Department,DC=*DOMAIN NAME*,DC=de'
if (-not $result) {
# several exceptions from the default user DN exist for administrative users and/or service accounts
$result = $member.distinguishedname -match "CN=.+,(?:OU=Administrators,)?OU=(?:Administrators),OU=Infrastructure,DC=*DOMAIN NAME*,DC=de"
if (-not $result) {
$result = $member.distinguishedname -match "CN=.+,(?:OU=Testusers,)?OU=(?:Service Accounts),?OU=(?:Windows-Servers),OU=Infrastructure,DC=*DOMAIN NAME*,DC=de"
}
}
if ($result) {
$dept = $Matches[1]
Write-Host $member.Name";" $groupname";" $group";" $dept
} else {
throw "ERROR: User DN $($member.distinguishedName) does not match any known user departmental OU."
}
}
} else {
throw "Associated user names field does not match group standard naming scheme."
}
}
}
$OutArray | Export-Csv C:\temp\test.csv -NoTypeInformation
你的ForEach-Object
loop doesn't produce non-captured output on the Success output stream。因此,没有任何内容附加到 $OutArray
,因此,没有任何内容写入输出 CSV。
您通过
创建的输出Write-Host $member.Name";" $groupname";" $group";" $dept
已写入主机控制台,无法捕获。您需要将其替换为 Write-Output
才能将输出写入 Succes 输出流(因此可以将其捕获在变量中或使用管道进行处理):
Write-Output $member.Name";" $groupname";" $group";" $dept
您也可以完全删除 cmdlet,因为写入输出流是 PowerShell 的默认行为,但仅适用于单个字符串,因此您需要 concatenante 元素:
$member.Name + ";" + $groupname + ";" + $group + ";" + $dept
但是,这仍然不会产生所需的 CSV 输出,因为 Export-Csv
需要对象输入并将对象的属性写入 CSV 的字段。如果为它提供一个以分号分隔的字符串数组,Export-Csv
将导出这些字符串对象 (Length
) 中唯一的 属性。
您可以使用 Out-File
或 Set-Content
(我不推荐)之类的 cmdlet 将以分号分隔的字符串列表写入输出文件:
$OutArray | Set-Content 'C:\temp\test.csv'
或者(更好)您可以在循环内构造适当的对象:
New-Object -Type PSObject -Property ([ordered]@{
Name = $member.Name
Groupname = $groupname
Group = $group
Department = $dept
})
并使用 Export-Csv
:
$OutArray | Export-Csv 'C:\temp\test.csv' -Delimiter ';' -NoType
此外,由于 ForEach-Object
和 Export-Csv
都使用管道,您可以直接连接它们而无需先将输出收集到变量中:
Get-BrokerApplication -AdminAddress *CITRIX DDC* | ForEach-Object {
...
} | Export-Csv 'C:\temp\test.csv' -Delimiter ';' -NoType