【问题标题】:CSV Export PowerShell Script with piped foreach带有管道 foreach 的 CSV 导出 PowerShell 脚本
【发布时间】:2017-10-10 00:20:00
【问题描述】:

我使用以下 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

【问题讨论】:

  • 欢迎来到 StackOverflow。请采取tour,学习提出好问题stackoverflow.com/help/how-to-ask,制作minimal reproducible example。 MCVE 应包括各种样本输入(说明所有方面)和所需的输出。如果您正在寻求有关调试代码的帮助,请参阅 ericlippert.com/2014/03/05/how-to-debug-small-programs 请提供有关它如何不起作用、错误消息、观察到的不良行为、与所需输出的差异等的更多信息...
  • 你能给我们看一个你想要在 CSV 中做什么的例子吗?

标签: powershell csv foreach export-to-csv citrix


【解决方案1】:

您的ForEach-Object 循环不会在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-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

【讨论】:

  • 非常感谢!我会尝试您的建议并在实施后立即回复:-)
  • 我已经在我的循环中使用适当的对象尝试了您的建议,现在它可以与 Export-csv 'C:\temp\test.csv' -Delimiter ';' 配合使用-NoType - 再次感谢您的示例和解释!
猜你喜欢
  • 2019-05-12
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-02
  • 1970-01-01
相关资源
最近更新 更多