PowerShell In Powershell mit Variablen eine CSV erstellen

Alfredo64

Cadet 3rd Year
Registriert
Jan. 2020
Beiträge
43
Hallo,

das ist das erste mal, dass ich mich in Powershell mit CSV's beschäftige.

Ich möchte eine CSV mit zwei spalten erstellen. In der einen sollen die Ordner Namen stehen und in der anderen Spalte die Pfade des Ordners. Allerdings klappt mein ansatz mit schon nicht.
PowerShell:
$Ordner = "backup"

$Diferenz1 | ConvertTo-Csv | Export-Csv -Path C:\Users\Projekte\Intern\test.csv -Encoding Default -Delimiter ","

Oder hat vielleicht jemand eine ganz andere Idee wie man so etwas in eine Datei speichern kann?
Allerdings ist es wichtig, dass man einfach sehen kann welcher Dateipfad zu welchem Ordner gehört.
 
Und was steckt in $Differenz1 drin?

Übrigens ist convertto-csv nicht zusätzlich erforderlich. Das formatiert nur die Eingabe als CSV-String.
Export-Csv nimmt die Eingabe her, konvertiert implizit und schreibt das Ergebnis in eine Datei - sprich,
PowerShell:
$Input | ConvertTo-Csv | Out-File -Path xyz
ist funktional identisch zu
PowerShell:
$Input | Export-CSV -Path xyz
.
 
  • Gefällt mir
Reaktionen: Alfredo64
Hallo @RalphS

danke für deine Antwort.

Und was steckt in $Differenz1 drin?

Dahinter sind ein paar Strings. Ich habe isgesamt 3 Variablen und jede sollte eine zeile in der csv bekommen.
Ist das möglich?
 
Also string[] $Differenz1?

So ganz ohne Weiteres nicht (wenn ich Dich richtig verstehe). Die *-CSV cmdlets nehmen ein Objekt her und schreiben für jede Objekteigenschaft eine Spalte in die CSV. Strings haben keine Objekteigenschaften (jedenfalls keine für *-CSV relevanten).

Wenn $Differenz1 ein String-Array ist und als einzelne Zeile in die CSV soll, dann wär glaub ich der praktikabelste Weg sowas in der Art:
PowerShell:
$Differenz1 -join $Delimiter | Out-File -Path $csvDatei -Append

Das fügt das Array $Differenz1 in einen String zusammen und verwendet als "Kleber" zwischen den Strings den Wert von $Delimiter. Für CSV also , oder ; (wenn Excel involviert ist). Das ist dann bereits eine gültige CSV-Zeile. Die geht dann in die CSV-Datei.

Haken daran ist aber, daß dann alle weiteren Variablen, die außerdem in der CSV-Datei landen sollen, ebenfalls Arrays sein müssen, welche exakt gleich groß sind wie $Differenz1. CSV ist zweidimensional (Spalte x Zeile); mit variabler Arraylänge kann nicht garantiert werden, daß das Gesamtergebnis jeweils in der richtigen Spalte innerhalb der CSV landet.

Alternativ: Ein Objekt erstellen mit passend vielen Eigenschaften und diesen Eigenschaften dann die Feldwerte für die CSV zuweisen. Dann kann dieses Objekt per Pipe in *-CSV geschoben werden und das Ergebnis ist "das Richtige".

Zweiter Haken: Wenn "," in den Strings enthalten sein können. Dann muß man basteln und explizit " " einfügen, zB als
PowerShell:
'"' + ($stringarray -join '","') + '"'
.
 
  • Gefällt mir
Reaktionen: Alfredo64
RalphS schrieb:
Alternativ: Ein Objekt erstellen mit passend vielen Eigenschaften und diesen Eigenschaften dann die Feldwerte für die CSV zuweisen. Dann kann dieses Objekt per Pipe in *-CSV geschoben werden und das Ergebnis ist "das Richtige".
Ich würde gerne diesen Weg gehen allerdings verstehe ich noch nicht ganz wie sie das mit den passend vielen Eigenschaften meinen. Benötige ich nicht zwei Objekte eines für den Ordner Namen und eines für den Dateipfad.

Außerdem weiß ich nicht wie man so ein passendes Objekt erstellt. Hast du vielleicht eine Erklärung oder Beispiel für mich?
 
Ich habe mit jetzt ein Objekt erstellt:
Code:
New-Object PsObject -property @{
'Ordner' = $item.Ordner
'Dateipfad' = $item.Dateipfad
}

Wie kann ich jetzt in der CSV sagen das der Inhalt von der Variable $Diferenz nur in Spalte Ordner und $Dateipfad nur in die Spalte Dateipfad geht?
 
Zuletzt bearbeitet:
Zurück
Oben