2012-02-09 13 views
6

Ho uno script come il seguente:PowerShell - Export-CSV e aggiungere

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

Tuttavia, io non sono in grado di farlo in uscita tutti i risultati per la $ out_file in quanto non sembra per aggiungere i dati al file csv. Ho provato una serie di cose, idee e suggerimenti trovati online. Nessuno di loro sembra funzionare e sento che mi manca qualcosa piuttosto semplice qui. C'è un modo per rendere questo aggiungere i dati a un file? In tal caso, potresti fornire un esempio o uno snippet di codice per farlo funzionare in quel modo? Non sto chiedendo una riscrittura di tutto il codice o qualcosa del genere, solo un modo per rendere i dati che vengono esportati in aggiunta al file che viene emesso.

risposta

9

Converti il ​​ciclo foreach in un oggetto foreach e sposta export-csv all'esterno dell'oggetto foreach outter in modo che sia possibile reindirizzare tutti gli oggetti all'esportazione-csv.

Qualcosa di simile (non testata):

$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

Per curiosità, come fa questo cambia l'elaborazione per consentire questo lavoro? Perché dovrei voler usare un oggetto ForEach invece di un ForEach? – John

+0

perché è possibile reindirizzare tutti insieme anziché salvare per ogni set di essi. – manojlds

3

Come Sune ha accennato, Export-Csv di PowerShell v3 ha un flag Append ma no codifica di protezione. manojlds è corretto, dal momento che il tuo codice sta scrivendo tutti i nuovi dati in un nuovo file CSV.

Nel frattempo, è possibile accodare i dati in un file CSV da:

  1. Convertire gli oggetti in formato CSV con ConvertTo-Csv
  2. Striscia dell'intestazione -e digitare informazioni se necessario- e raccogliere il CSV dati solo
  3. aggiungere i nuovi dati CSV al file CSV attraverso Add-Content o out-File, assicurarsi di utilizzare la stessa codifica dei caratteri

Ecco un esempio:

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

Dopo la versione 3 è possibile utilizzare:

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