none
Inhalte aus zwei Textdateien auslesen und Zeile für Zeile abarbeiten

    Frage

  • Hallo,

    der Titel ist vielleicht etwas verwirrend. Hier versuche ich das ganze mal etwas zu verdeutlichen. Wir ändern in nächjster Zeit unsere DFS Struktur. Die Dahinterliegenden Server werden gesplittet und die neuen habe dementsprechend andere Namen. Deswegen müssen die Pfade der DFS-Links angepasst werden.

    In der einen Datei stehen die alten Pfade in der anderen die neuen. Somit ist in der jeweiligen Zeile der Dateien passend alt und neu. \\fscl_groups_de\groups\Alle soll dann zu \\defile01\groups\Alle werden das für hunderte von DFS-Links, da auch die Homeverzeichnisse von allen Anwendern so verwaltet werden.

    Im ersten Schritt möchte ich erstmal eine Ausgabe generieren, mit der ich ausgebe

    "Dies ist der alte Pfad " + $alterPfad + " Dies ist der neue Pfad" + $neuerPfad

    Damit ich es später so verarbeiten kann, dass ich die einzelnen Elemente in folgenden Befehl einsetzen kann

    Set-DfsnFolderTarget -Path "$alterPfad" -TargetPath "$neuerPfad" -State Online 

    Aber irgendwie bekomme ich es nicht hin, das jede Zeile aus jeder Datei einzeln verarbeitet wird. 

    Hat jemand ein paar Denkanstöße für mich? Ich habe es mit nestet foreach ausprobiert, aber bin da auch nicht mit weitergkommen

    Gruß

    Malte  

    Freitag, 7. April 2017 09:34

Antworten

  • Ich habe schon was gefunden, muss dann nur mit einer CSV arbeiten. Ist nicht ganz ein Dreizeiler

    $list = Import-Csv C:\source_target.csv -Delimiter ";"
    
    Foreach($link in $list) 
    {
    "Dies ist der alte Link: " + $link.Source+ " " + "Dies ist der neue Link: " + $link.Destination
    }

    • Als Antwort markiert Malte_EP Freitag, 7. April 2017 10:23
    Freitag, 7. April 2017 09:53
  • Hallo,

    die entscheidende Frage ist: Stimmen die Dateien in ihren Zeilennummern vollkommen überein? D.h., sind die Zeilennummern von altem und neuem Pfad immer identisch?

    Wenn ja: Versuch es mit zwei StreamReadern. Damit kannst du jeweils synchron die nächste Zeile jeder Datei laden und die dann einfach in ein CustomObject schreiben. Das kann dann etwa so aussehen:

    $readerAlt = New-Object System.IO.StreamReader("PfadZurDatei1")
    $readerNeu = New-Object System.IO.StreamReader("PfadZurDatei2")
    
    $Array = @()
    while(-not $readerAlt.EndOfStream)
    {
       $obj = "" | select Alt, Neu
       $obj.Alt = $readerAlt.ReadLine()
       $obj.Neu = $readerNeu.ReadLine()
       $Array += $obj
    }
    
    $readerAlt.Close(); $readerNeu.Close()

    • Als Antwort markiert Malte_EP Freitag, 7. April 2017 10:23
    Freitag, 7. April 2017 10:02

Alle Antworten

  • Malte,

    vielleicht zeigst Du erstmal, was Du schon hast, dann brauchen wir nicht bei Null anzufangen, sondern können evtl. Dein Script einfach nur "streamlinen" oder "debuggen".  ;-)


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Freitag, 7. April 2017 09:52
  • Ich habe schon was gefunden, muss dann nur mit einer CSV arbeiten. Ist nicht ganz ein Dreizeiler

    $list = Import-Csv C:\source_target.csv -Delimiter ";"
    
    Foreach($link in $list) 
    {
    "Dies ist der alte Link: " + $link.Source+ " " + "Dies ist der neue Link: " + $link.Destination
    }

    • Als Antwort markiert Malte_EP Freitag, 7. April 2017 10:23
    Freitag, 7. April 2017 09:53
  • Freitag, 7. April 2017 09:56
  • Supi. 

    Na denn - viel Erfolg!  ... und wenn Du noch mehr Unterstützung brauchst  .... Du weißt ja jetzt, wo Du uns findest.  ;-)


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Freitag, 7. April 2017 10:01
  • Hallo,

    die entscheidende Frage ist: Stimmen die Dateien in ihren Zeilennummern vollkommen überein? D.h., sind die Zeilennummern von altem und neuem Pfad immer identisch?

    Wenn ja: Versuch es mit zwei StreamReadern. Damit kannst du jeweils synchron die nächste Zeile jeder Datei laden und die dann einfach in ein CustomObject schreiben. Das kann dann etwa so aussehen:

    $readerAlt = New-Object System.IO.StreamReader("PfadZurDatei1")
    $readerNeu = New-Object System.IO.StreamReader("PfadZurDatei2")
    
    $Array = @()
    while(-not $readerAlt.EndOfStream)
    {
       $obj = "" | select Alt, Neu
       $obj.Alt = $readerAlt.ReadLine()
       $obj.Neu = $readerNeu.ReadLine()
       $Array += $obj
    }
    
    $readerAlt.Close(); $readerNeu.Close()

    • Als Antwort markiert Malte_EP Freitag, 7. April 2017 10:23
    Freitag, 7. April 2017 10:02
  • Ja die wären absolut identisch, das hätte ich vorher sichergestellt.

    Ich probiere deins aus reinem Interesse einfach mal aus. Danke dafür

    Freitag, 7. April 2017 10:06
  • Mit Überprüfung sieht das dann so aus
    $readerAlt = New-Object System.IO.StreamReader("C:\source_target.txt")
    $readerNeu = New-Object System.IO.StreamReader("C:\target_target.txt")
    
    $Array = @()
    while(-not $readerAlt.EndOfStream)
    {
       $obj = "" | select Alt, Neu
       $obj.Alt = $readerAlt.ReadLine()
       $obj.Neu = $readerNeu.ReadLine()
       $Array += $obj
       
       "Dies ist der alte Link: " + $obj.Alt + " Dies ist der neue Link: " + $obj.Neu
    }
    
    $readerAlt.Close(); $readerNeu.Close()

    Freitag, 7. April 2017 10:22
  • Alternativ hättest du ans Ende des Skriptes auch 

    $array | Out-Gridview

    schreiben können.

    Und noch ein Tipp: Man sollte sich nicht angewöhnen, irgendwelche Ausgaben einfach so in den Output-Stream zu stellen. Schreib lieber noch Write-Host davor. Solltest du das Skript mal von einem anderen Skript aus aufrufen oder in eine Funktion umwandeln, kann das mit den Rückgaben zu Fehlern führen.

    Freitag, 7. April 2017 10:52