derhoeppi
Goto Top

PowerShell Array in Textdatei ausgeben

Hallo,

der Titel hört sich nicht allzu schwer an. Ich habe eine Foreach Schleife die Durchläuft und ein Array füllt. Wenn dieses Array gefüllt ist, möchte ich davor und danach noch etwas hinzufügen und das ganze in eine Textdatei ausgeben.
$i = '1','2','3','4','5'  
foreach ($a in $i){
    Write-Host $a
}

$script:test = @()
foreach ($a in $i){
    $script:text = "Das ist ein Test "+ $a  
    $script:test += $text 
}
if ($test.Count -eq 0){
    Write-Host "Test leer"  
    }
    else{
        $test | Out-File C:\Temp\test.txt
        }
if ($test.count -eq 0){
    write-Host "Inhalt leer"  
    }
    else{
        $script:begin = "Das ist ein Text davor "  
        $script:begin += $test
        $script:begin | Out-File C:\Temp\test2.txt

        }
Die Ausgabe von $test in die Textdatei ist vernünftig formatiert, so dass jedes Element im Array in einer eigenen Zeile steht. Wenn ich dann $begin ausgebe, ist alles in einer Zeile. Wie kann ich es erreichen, dass jedes Element im Array in einer eigenen Zeile ausgegeben wird?

Gruß
derhoeppi

Content-ID: 278519

Url: https://administrator.de/contentid/278519

Ausgedruckt am: 22.11.2024 um 10:11 Uhr

colinardo
Lösung colinardo 27.07.2015, aktualisiert am 28.07.2015 um 07:55:35 Uhr
Goto Top
Hallo derhoeppi,
da gibtes mehrere Methoden, hier ein paar davon:
#Array
$array = '1','2','3','4','5'   
# Text den du in der ersten Zeile stehen haben willst
$text_davor = "Erste Zeile"  

# Wichtig! zuerst ein leeres Array erzeugen
$textarray = @()
# Erst dann die Elemente zum leeren Array hinzufügen
$textarray += $text_davor
$textarray += $array
# Unser neues Array ausgeben 
$textarray | out-file 'C:\temp\test2.txt'  
Du kannst auch erst den Vor-Text in das File ausgeben, und dann danach mit dem Parameter -Append von Out-File den Rest hinein schreiben.

Hier noch eine Variante:
#Array
$array = '1','2','3','4','5'   
# Text den du in der ersten Zeile stehen haben willst
$text_davor = "Erste Zeile"  

$text_davor + "`r`n" + ($array -join "`r`n") | out-file 'C:\temp\test2.txt'  
(`r`n stellt einen Windows Zeilenumbruch dar, und wird nur innerhalb von doppelten Anführungszeichen aufgelöst)

back-to-topZur Erklärung warum dein Code so nicht läuft

Wichtig ist das du nicht Plaintext mit Arrays in der Ausgabe mischst, entweder alles als ein Array an out-file pipen, oder alles in reine Strings umwandeln.

In deinem Code hast du erstens einen Tippfehler und zwei Variablen (einmal $script:text und ein anderes Mal $script:test), und zweitens ist die Variable $script:begin ganz unten anfänglich kein Array sondern du initialisierst sie als String ($script:begin = "Das ist ein Text davor "), deswegen erhältst du durch den Mischmasch an String und Array die Ausgabe in einer Zeile ! Der Grund: Der Operator + hängt bei einer Variablen des Typs String den Text einfach hinten dran anstatt eine neue Zeile zu erzeugen. Wenn die Variable aber nun vom Typ Array ist, bedeutet der Operator + das ein neues Element hinzugefügt werden soll, das bei der Ausgabe automatisch in eine neue Zeile wandert.
Das hier sollte es nochmal verdeutlichen
# Initialisierung einer Textvariablen
$text = "Hallo"
# Text wird hinten angehangen weil Variable vom Typ String
$text += " Uwe"
# Ausgabe erzeugt eine Zeile
$text

# Initialisierung einer Array-Variablen
$array = @("Hallo")
# neues Array-Element anhängen
$array += "Uwe"
# Ausgabe erzeugt zwei Zeilen
$array
Wenn man einen puren String mit einem Array mischt werden die Array-Elemente per Default ohne Trennzeichen aneinandergehangen - das ist der einfache Grund für dein Problem face-smile

Grüße Uwe
derhoeppi
derhoeppi 28.07.2015 um 08:01:58 Uhr
Goto Top
Hallo Uwe,

vielen Dank für deine Hilfe. Die fehlende Array Initialisierung von $begin klingt logisch. Manchmal sieht man den Wald vor lauter Bäumen nicht.
Den Text den ich davor schreiben möchte, soll nur geschrieben werden, wenn im Laufe des Skripts das andere Array gefüllt wird. Ich möchte mir damit unnötige Textdateien ersparen.

Gruß
derhoeppi