Powershell - Export-CSV и Добавить - PullRequest
       13

Powershell - Export-CSV и Добавить

6 голосов
/ 10 февраля 2012

У меня есть такой скрипт:

$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 ]

10 голосов
/ 10 февраля 2012

Преобразуйте цикл foreach в объект foreach и переместите 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
4 голосов
/ 10 февраля 2012

- приложение не работает в Powershell v2.0 Используйте обходной путь Дмитрия Сотикова: http://dmitrysotnikov.wordpress.com/2010/01/19/export-csv-append/

Однако я бы порекомендовал отличное решение manojlds!

3 голосов
/ 10 февраля 2012

Как уже упоминал Sune, в Export-Csv PowerShell v3 есть флаг добавления, но нет защиты кодировки символов . manojlds верен, поскольку ваш код записывает все новые данные в новый файл CSV.

Между тем, вы можете добавить данные в CSV с помощью:

  1. Преобразование объектов в CSV с помощью ConvertTo-Csv
  2. Снимите заголовок - и введите информацию, если необходимо - и соберите Только данные CSV
  3. Добавить новые данные CSV в файл CSV через Add-Content или Out-File, обязательно используйте ту же кодировку символов

Вот пример:

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
1 голос
/ 13 ноября 2017

После версии 3 вы можете использовать:

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