Powershell - Export-CSV和Append

时间:2012-02-09 22:57:39

标签: powershell export-to-csv

我有一个如下脚本:

$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 个答案:

答案 0 :(得分:10)

将foreach循环转换为foreach-object并将export-csv移动到outter 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

答案 1 :(得分:4)

-append在Powershell v2.0中被破坏了 使用Dmitry Sotikovs的工作单:http://dmitrysotnikov.wordpress.com/2010/01/19/export-csv-append/

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

答案 2 :(得分:3)

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

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

  1. 使用ConvertTo-Csv
  2. 将对象转换为CSV
  3. 如有必要,删除标题和类型信息 - 并收集 仅限CSV数据
  4. 通过Add-Content或将新CSV数据附加到CSV文件 Out-File,请务必使用相同的字符编码
  5. 以下是一个示例:

    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
    

答案 3 :(得分:1)

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

Export-Csv $out_file -append -notypeinformation -encoding "unicode"