![](/img/trans.png)
[英]export to csv powershell script using multiple foreach statements
[英]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
循環不會在Success輸出流上生成非捕獲輸出。 因此,沒有任何內容附加到$OutArray
,因此,沒有任何內容寫入輸出CSV。
您創建的輸出
Write-Host $member.Name";" $groupname";" $group";" $dept
寫入主機控制台,無法捕獲。 您需要將其替換為Write-Output
以將輸出寫入Succes輸出流(因此可以在變量中捕獲或使用管道處理):
Write-Output $member.Name";" $groupname";" $group";" $dept
您也可以完全刪除cmdlet,因為寫入輸出流是PowerShell的默認行為,但僅限於單個字符串,因此您需要連接元素:
$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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.