9

我有一个如下脚本:

$in_file = "C:\Data\Need-Info.csv"
$out_file = "C:\Data\Need-Info_Updated.csv"
$list = Import-Csv $in_file 
ForEach ( $user in $list ) {
    $zID = $user.zID
    ForEach-Object { 
        Get-QADUser -Service 'domain.local' -SearchRoot 'OU=Users,DC=domain,DC=local' -SizeLimit 75000 -LdapFilter "(&(objectCategory=person)(objectClass=user)(PersonzID=$zID))" | Select-Object DisplayName,samAccountName,@{Name="zID";expression={$zID}} | Export-Csv $out_file -NoTypeInformation -Force
    }
}

但是,我无法让它将所有结果输出到 $out_file,因为它似乎没有将数据附加到 csv 文件中。

有没有办法让它将数据附加到文件中?

4

4 回答 4

10

将 foreach 循环转换为 foreach-object,并将 export-csv 移动到外部 foreach 对象之外,以便您可以将所有对象通过管道传输到 export-csv。

像这样的东西(未经测试):

$list | ForEach {
    $zID = $_.zID
    ForEach-Object { 
        Get-QADUser -Service 'domain.local' -SearchRoot 'OU=Users,DC=domain,DC=local' -SizeLimit 75000 -LdapFilter "(&(objectCategory=person)(objectClass=user)(PersonzID=$zID))" | Select-Object DisplayName,samAccountName,@{Name="zID";expression={$zID}}
    }
} | Export-Csv $out_file -NoTypeInformation -Force
于 2012-02-09T23:15:43.833 回答
4

-append在 PowerShell v2.0 中被破坏。您可以改用 Dmitry Sotikovs 解决方法:http: //dmitrysotnikov.wordpress.com/2010/01/19/export-csv-append/

但是,我会推荐 manojlds 出色的解决方案!

于 2012-02-09T23:41:35.563 回答
4

正如 Sune 提到的,PowerShell v3 的 Export-Csv 有一个 Append 标志,但没有字符编码保护。manojlds 是正确的,因为您的代码正在将所有新数据写入新的 CSV 文件。

同时,您可以通过以下方式将数据附加到 CSV:

  1. 使用 ConvertTo-Csv 将对象转换为 CSV
  2. 去除标题——必要时输入信息——并仅收集 CSV 数据
  3. 通过 Add-Content 或 Out-File 将新的 CSV 数据附加到 CSV 文件中,一定要使用相同的字符编码

这是一个示例:

1..3 | ForEach-Object {
 New-Object PSObject -Property @{Number = $_; Cubed = $_ * $_ * $_}
} | Export-Csv -Path .\NumTest.csv -NoTypeInformation -Encoding UTF8

# create new data
$newData = 4..5 | ForEach-Object {
 New-Object PSObject -Property @{Number = $_; Cubed = $_ * $_ * $_}
} | ConvertTo-Csv -NoTypeInformation

# strip header (1st element) by assigning it to Null and collect new data
$null, $justData = $newData

# append just the new data
Add-Content -Path .\NumTest.csv -Value $justData -Encoding UTF8

# create more new data, strip header and collect just data
$null, $data = 6..9 | ForEach-Object {
 New-Object PSObject -Property @{Number = $_; Cubed = $_ * $_ * $_}
} | ConvertTo-Csv -NoTypeInformation

# append the new data
Add-Content -Path .\NumTest.csv -Value $data -Encoding UTF8

# verify
Import-Csv .\NumTest.csv

# clean up
Remove-Item .\NumTest.csv
于 2012-02-10T04:50:57.400 回答
2

在版本 3 之后,您可以使用:

Export-Csv $out_file -append -notypeinformation -encoding "unicode"
于 2017-11-13T17:26:54.977 回答