簡體   English   中英

使用管道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循環不會在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-FileSet-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-ObjectExport-Csv可以與管道一起使用,因此您可以直接連接它們而無需先在變量中收集輸出:

Get-BrokerApplication -AdminAddress *CITRIX DDC* | ForEach-Object {
  ...
} | Export-Csv 'C:\temp\test.csv' -Delimiter ';' -NoType

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM