2012-02-09 17 views
6

que tienen una secuencia de comandos como la siguiente:Powershell - Export-CSV y Anexar

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

Sin embargo, no soy capaz de conseguir que la salida de todos los resultados de los $ out_file ya que no parece para agregar los datos al archivo csv. He intentado varias cosas, ideas y sugerencias encontradas en línea. Ninguno de ellos parece funcionar y siento que me falta algo bastante fácil aquí. ¿Hay alguna manera de hacer que esto anexe los datos a un archivo? De ser así, ¿podría proporcionar un ejemplo o un fragmento de código para que funcione de esa manera? No estoy pidiendo una reescritura de todo el código o cualquier cosa en esa línea, solo una forma de hacer que los datos que se están exportando se agreguen al archivo que se genera.

Respuesta

9

Convierta el bucle foreach en un objeto foreach y mueva export-csv al exterior del objeto foreach outter para que pueda canalizar todos los objetos al export-csv.

Algo como esto (no probado):

$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

Por curiosidad, ¿cómo cambia esto el procesamiento para permitir que esto funcione? ¿Por qué querría usar un ForEach-Object en lugar de un ForEach? – John

+0

porque puede canalizarlos todos juntos en lugar de guardarlos para cada conjunto de ellos – manojlds

3

Como mencionó Sune, Export-Csv de PowerShell tiene un indicador de Append pero no hay protección de codificación de caracteres. manojlds es correcto, ya que su código está escribiendo todos los datos nuevos en un nuevo archivo CSV.

Mientras tanto, usted puede añadir datos a un archivo CSV por:

  1. Convertir los objetos a CSV con ConvertTo-Csv
  2. la cabecera de Gaza -y escribir información si es necesario- y recoger el CSV datos sólo
  3. añadir los nuevos datos CSV en el archivo CSV a través de Add-contenido o Out-File, asegúrese de usar misma codificación de caracteres

Este es un ejemplo:

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

Después de la versión 3 que puede utilizar:

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