2012-02-09 6 views
6

У меня есть сценарий, такие как:Powershell - Export-CSV и Append

$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. Я пробовал несколько вещей, идей и предложений, найденных в Интернете. Никто из них, похоже, не работает, и я чувствую, что мне не хватает чего-то довольно простого здесь. Есть ли способ сделать это добавление данных в файл? Если да, можете ли вы привести пример или фрагмент кода, чтобы заставить его работать таким образом? Я не прошу переписать весь код или что-то в этом роде, просто способ сделать экспортированные данные добавленными к выводимому файлу.

ответ

9

Преобразуйте петлю foreach в объект foreach и переместите экспорт-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 
+0

Из любопытства, как это изменить обработку, чтобы это работало? Почему я должен использовать ForEach-Object вместо ForEach? – John

+0

, потому что вы можете их комбинировать, а не сохранять для каждого набора из них. – manojlds

4

-Append сломана Powershell v2.0 Использование Дмитрий Sotikovs workaound: http://dmitrysotnikov.wordpress.com/2010/01/19/export-csv-append/

Я бы, однако, рекомендуем manojlds отличное решение!

+2

В PSv2 нет -Append для экспорта-CSV. Хотя хорошая ссылка. Хороший пример того, когда нужно создать прокси-сервер cmdlet. –

3

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

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

  1. Преобразование объектов в CSV с ConvertTo-Csv
  2. Газа заголовок -И если ввести информацию necessary- и собрать 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 
0

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

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