De PowerShell-cmdlet Export-Csv
en de PowerShell-cmdlets Import-Csv
stellen beheerders in staat om CSV-bestanden te importeren via een foreach-lus, gebruik Export-Csv
om CSV-bestanden aan te vullen en arrays naar een CSV-bestand te exporteren, en nog veel meer.
In dit artikel leer je over veelvoorkomende scenario’s waarin je PowerShell kunt gebruiken om CSV-bestanden te beheren zoals:
- Het lezen van CSV-bestanden met PowerShell
- Het opslaan van CSV-bestanden met PowerShell
- Het formatteren van de uitvoer voordat
Export-CSV
wordt uitgevoerd - Het toevoegen aan een CSV
- Het toevoegen van verschillen aan een bestaand bestand
Export-CSV
en de#TYPE
-tekenreeks
Als je niet bekend bent met de werking van CSV-bestanden, dan zijn het tekstbestanden die een standaardformaat volgen waarin je waarden in een tabel letterlijk door komma’s scheidt. Je kunt een CSV-bestand maken in PowerShell met behulp van de Export-Csv
-cmdlet en een of meer objecten eraan doorpiping.
De onderstaande opdracht zoekt naar de eerste twee actieve processen en geeft de gegenereerde objecten door aan de Export-Csv
-cmdlet. De Export-Csv
-cmdlet maakt vervolgens een CSV-bestand met de naam processes.csv in de root van je systeemschijf (meestal C:\).
Nu open processes.csv met Kladblok. Je zou bovenaan "Name","SI","Handles","VM"
moeten zien als koppen. Je zult ook #TYPE System.Diagnostics.Process
zien, wat nu misschien niet veel zin heeft. Maak je geen zorgen, we zullen die string behandelen in dit artikel.
Het lezen van CSV-bestanden met Import-Csv
Wil je meer tips zoals deze? Bekijk mijn persoonlijke PowerShell-blog.
PowerShell heeft een paar commando’s waarmee je tekstbestanden kunt lezen. Die commando’s zijn Get-Content
en Import-Csv
. Technisch gezien lezen beide cmdlets het bestand op dezelfde manier. Maar Import-Csv
gaat nog een stap verder. Import-Csv
begrijpt de onderliggende structuur van niet alleen een tekstbestand, maar ook een CSV-bestand.
Aangezien een CSV-bestand een bepaald schema volgt, begrijpt Import-Csv
het CSV-schema. Dit cmdlet leest niet alleen het tekstbestand vanaf de schijf, maar zet ook de rijen in het CSV-bestand om in PowerShell-objecten.
Niet-CSV-bestanden
Gewoonlijk is de data van een CSV komma-gescheiden, maar er zijn momenten waarop een CSV (technisch gezien op dat moment geen CSV meer) data heeft die gescheiden is door een ander scheidingsteken. Die scheidingstekens zijn soms een tab of misschien een puntkomma.
Als u een CSV-bestand heeft met een andere scheidingsteken, kunt u de Delimiter
-parameter gebruiken. Met deze parameter geeft u aan Import-Csv
aan om niet naar komma’s te zoeken, wat standaard gebeurt, maar naar een andere waarde.
Bijvoorbeeld, als u een bestand heeft dat door tabs wordt gescheiden, kunt u het bestand als volgt lezen:
Headers toevoegen
A common Import-Csv
parameter is Header
. This parameter lets you specify the property names of the objects created by this cmdlet.
Standaard behandelt de Import-Csv
-cmdlet de bovenste rij van het CSV-bestand als headers. Het zal deze waarden vervolgens converteren naar eigenschappen van elke rij (object). Maar als u een CSV-bestand heeft zonder een headerrij, kunt u de Header
-parameter gebruiken om er zelf een te definiëren.
De Header
-parameter voorkomt dat Import-CSV
uw eerste rij als uw header gebruikt en bespaart u ook hoofdpijn door het CSV-bestand handmatig te moeten openen om headers toe te voegen.
Om dit gedrag te demonstreren, opent u Kladblok en kopieert/plakt u de onderstaande tekst. Deze tekst zal een dataset met drie rijen en twee kolommen voorstellen.
Sla het tekstbestand op als test.csv. Vergeet niet om de bestandsextensies in te schakelen of het bestand tussen aanhalingstekens te plaatsen zodat u het niet per ongeluk opslaat als een bestand met als eindigt op .csv.txt!
Gebruik vervolgens Import-CSV
om het zojuist gemaakte CSV-bestand te lezen zonder de Header
-parameter en inspecteer de output.
Merk op dat het de eerste rij als de eigenschappen van het object heeft gebruikt. `A
` en `1
` zijn geen “labels” die je wilt voor de eigenschappen van het object. `A
`, `b
` en `c
` zijn letters, terwijl `1
`, `2
` en `3
` getallen zijn. Je moet die definiëren met de parameter `Header
` zoals hieronder:
Het opslaan van CSV-bestanden met PowerShell
Als je een CSV-bestand wilt maken of opslaan vanuit PowerShell-objecten, kun je ook de andere kant op gaan. Terwijl de cmdlets `Import-Csv
` een CSV-bestand naar PowerShell-objecten “omzetten”, doet `Export-Csv
` het tegenovergestelde. Deze cmdlet “zet” PowerShell-objecten om naar een CSV-bestand.
Door een CSV-bestand op te slaan met `Export-Csv
`, kun je die gegevens later bekijken of gebruiken in andere systemen.
Bijvoorbeeld, ik kan alle lopende processen op mijn computer opslaan door Get-Process
te koppelen aan de `Export-Csv
` cmdlet.
De `Export-Csv
` cmdlet is eenvoudig van aard, maar er zijn een paar valkuilen om op te letten.
Opmaak van uitvoer voor het uitvoeren van Export-CSV
Zoals je hierboven hebt gezien, doet `Export-Csv
`, op zichzelf, een “ruwe” conversie. Het voegt geen speciale opmaak met opmaaktekst toe, voegt geen kleuren toe, enzovoort.
Een van de meest voorkomende valkuilen is proberen de uitvoer er mooi uit te laten zien voordat je deze naar een CSV exporteert. Veel gebruikers zullen proberen de uitvoer er beter uit te laten zien voordat ze naar een CSV exporteren. Maar ik ga je laten zien dat dit de zaken erger maakt.
Je kunt een CSV-bestand openen in Microsoft Excel en cursief maken, vetgedrukt maken, kleuren toevoegen en nog veel meer. Maar als je het bestand opslaat als een CSV (in plaats van een Excel-werkmap), worden alle opmaak verwijderd. Een CSV-bestand is gewoonweg niet “slim” genoeg.
Onthoud dat CSV-bestanden gewoon tekstbestanden zijn met waarden die worden gescheiden door komma’s (of soms tabs). Het leiden van Import-Csv
naar een Format-*
PowerShell-cmdlet zal niet werken zoals verwacht.
Volgens de documentatie van Microsoft Export-Csv: “Formatteer objecten niet voordat je ze naar de Export-CSV
cmdlet stuurt. Als Export-CSV
geformatteerde objecten ontvangt, bevat het CSV-bestand de opmaakeigenschappen in plaats van de objecteigenschappen.”
Waarom is dit zo?
Open een PowerShell-venster en maak wat dummy-gegevens. Laten we het voorbeeld van Get-Process
gebruiken dat in het eerste gedeelte van dit artikel is besproken. Maar dit keer, wijs de uitvoer toe aan een variabele. Pijp vervolgens die procesobjecten naar de Format-Table
cmdlet.

Format-Table
Je kunt zien dat je met Format-Table
nu een schone, tabulaire uitvoer hebt.
Sla deze uitvoer nu op in een andere variabele.
Bekijk nu de eigenschappen van zowel de waarden van de variabelen $a
als $b
met Get-Member
. Deze cmdlet zal je helpen begrijpen waarom deze twee ogenschijnlijk gelijke objecten niet op dezelfde manier naar een CSV-bestand worden geëxporteerd:


Format-Table
‘s many object typesDe uitvoer rechtstreeks van Get-Process
retourneert: TypeNaam: System.Diagnostics.Process
, terwijl de uitvoer van Format-Table
volledig anders is. Het retourneert veel verschillende typen met variërende eigenschappen.
Als je $a
en $b
bekijkt in de console, zou de uitvoer identiek lijken. Dit gedrag is te wijten aan het opmaaksysteem van PowerShell.
Hoe beïnvloedt dit de uitvoer van Export-Csv
?
Export-Csv
leest elk object zoals het is. Wanneer je de uitvoer doorstuurt naar een Format-*
cmdlet, wijzig je de invoer die Export-CSV
ontvangt. Dit heeft dan invloed op de uitvoer die wordt opgeslagen in je nieuwe CSV-bestand.
Als je uitvoer gaat doorsturen naar de Export-Csv
cmdlet, stuur dan geen uitvoer door naar een Format-*
cmdlet.
Onthoud dat CSV’s zich richten op gegevens, niet op opmaak.
Het toevoegen aan een CSV-bestand
Soms wil je misschien gegevens toevoegen aan een bestaand bestand in plaats van er volledig een nieuw te maken. Standaard zal Export-Csv
elk bestand overschrijven dat is gespecificeerd via de Pad
-parameter.
Als je gegevens aan een CSV wilt toevoegen, gebruik dan de Toevoegen
-parameter.
Laten we zeggen dat je een lus hebt waarmee je elk verwerkt object naar een CSV-bestand wilt opslaan. Voor elke iteratie heb je een ander object dat je naar een CSV-bestand wilt opslaan. Omdat je Export-Csv
herhaaldelijk aanroept, zal het dat CSV-bestand overschrijven als je de parameter Append
niet gebruikt. Zonder de Append
-parameter krijg je alleen het laatste object, wat in de meeste gevallen niet het gewenste resultaat is.
Het onderstaande voorbeeld zoekt de eerste vijf actieve processen. Vervolgens gaat het naar een PowerShell Import-Csv
foreach-lus en neemt de eigenschappen Name
en ProductVersion
één voor één op in het bestand test.csv.
Zonder de Append
-parameter zie je dat alleen het vijfde proces in het CSV-bestand wordt weergegeven.
Het toevoegen van verschillen aan een CSV-bestand
Het is mogelijk om alleen verschillen in eigenschappen toe te voegen aan een bestaand CSV-bestand met Export-Csv
. Dit betekent dat als de kolommen van een CSV-rij en het te registreren object verschillend zijn, je ze kunt toevoegen.
Om alleen verschillen aan het CSV-bestand toe te voegen, moet je de parameters Append
en Force
samen gebruiken. Volgens de documentatie van Microsoft “Wanneer de parameters Force
en Append
worden gecombineerd, kunnen objecten met niet-overeenkomende eigenschappen naar een CSV-bestand worden geschreven. Alleen de overeenkomende eigenschappen worden naar het bestand geschreven. De niet-overeenkomende eigenschappen worden verworpen.”
Om te demonstreren, maak één object aan met twee eigenschappen; Name
en Age
.
Maak nu een ander object aan met een eigenschap Name
en Zip
.
Elk object heeft verschillende eigenschappen.
Vervolgens, maak een CSV-bestand van het eerste object en probeer het tweede object toe te voegen aan de CSV zonder de Force
parameter. Je zult een foutmelding ontvangen.

Export-Csv
without Force
Echter, als je de Force
parameter gebruikt, zal Export-Csv
prima werken.
Echter, je zult merken dat de Zip
kolom verdwenen is in het CSV-bestand. Gebruik Force
met zorg. Het geeft mogelijk niet het beoogde resultaat.
Export-CSV
en de #TYPE
String
Standaard zal bij het gebruik van Export-CSV
zonder extra parameters een #TYPE
string worden opgenomen bovenaan je CSV-bestand. Deze string wordt vervolgens gevolgd door het type object dat Export-Csv
heeft ontvangen.
Meestal is deze string eigenlijk niet nuttig bij het verwerken van output. Deze string is er alleen voor het geval dat je het type object dat de eigenschappen en waarden afkomstig zijn, moet behouden.
Om deze string te verwijderen, gebruik de NoTypeInformation
parameter. Deze parameter verwijdert deze string volledig uit het CSV-bestand.
Merk op dat dit sinds PowerShell Core niet meer nodig is.
Samenvatting
Gebruik van de Import-CSV
en Export-CSV
PowerShell-cmdlets stellen u in staat om gemakkelijk te werken met CSV-bestanden. Dit zijn twee handige cmdlets die u regelmatig zou moeten gebruiken bij het omgaan met objecten en CSV-bestanden.
Mijn hoop is dat met de uitleg en voorbeelden die ik hier heb getoond, u een duidelijk begrip zult hebben van situaties waarin u deze cmdlets kunt benutten ten gunste van uzelf.
Wil je meer van dit soort tips? Bekijk dan mijn persoonlijke PowerShell-blog.