web-dev-qa-db-fra.com

Powershell - Export-CSV et ajout

J'ai un script comme celui-ci:

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

Cependant, je ne parviens pas à obtenir tous les résultats dans le fichier $ out_file, car il ne semble pas ajouter les données au fichier csv. J'ai essayé un certain nombre de choses, idées et suggestions trouvées en ligne. Aucun d’entre eux ne semble fonctionner et j’ai l’impression que je manque quelque chose de facile ici. Existe-t-il un moyen d’ajouter les données à un fichier? Si oui, pourriez-vous fournir un exemple ou un extrait de code pour que cela fonctionne de cette manière? Je ne demande pas une réécriture de tout le code ou quoi que ce soit dans ce sens, mais simplement un moyen d'ajouter les données exportées au fichier en sortie.

6
John

Conversion de la boucle foreach dans un foreach-objet et déplacer l'exportation csv à l'extérieur de l'objet foreach outter de sorte que vous pouvez diriger tous les objets à l'exportation csv.

Quelque chose comme ça (non testé):

$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
10
manojlds

-append est cassé dans Powershell v2.0 Utilisez le travail de Dmitry Sotikovs: http://dmitrysotnikov.wordpress.com/2010/01/19/export-csv-append/

Je recommanderais cependant manojlds excellente solution!

4
Sune

Comme Sune l'a mentionné, le fichier Export-Csv de PowerShell v3 comporte un indicateur Append mais pas de protection pour le codage des caractères . manojlds est correct car votre code écrit toutes les nouvelles données dans un nouveau fichier CSV.

Pendant ce temps, vous pouvez ajouter des données à un fichier CSV en:

  1. Convertir les objets au format CSV avec ConvertTo-Csv
  2. Dénudez l'en-tête - et saisissez les informations si nécessaire - et collectez uniquement les données CSV.
  3. Append les nouvelles données CSV dans le fichier CSV dans Add-Content ou Out-File, assurez-vous d'utiliser le codage de caractères même

Voici un échantillon:

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
zx38

Après la version 3, vous pouvez utiliser:

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