none
Textdateien lesen, eine Änderung machen und wieder speichern RRS feed

  • Frage

  • Hallo,ich habe folgendes Problem und bin ziemlicher Anfänger mit Powershell.

    Ich muß in einem Verzeichnis mit vielen Dateien (> 1000) nacheinander die Dateien laden, bestimmte Zeilen verändern und dann wieder zurückschreiben. Die eigentliche Änderung habe ich schon hinbekommen. Aber ich habe noch ein problem mit der Schleife die den Dateiinhalt liest.

    Ich hatte mir gedacht erste Datei lesen, ändern, schreiben, nächste lesen usw.

    Leider liest er derzeit immer den Inhalt aller Dateien und schreibt sie dann recht groß zurück. Wie kann ich ihn dazu bewegen immer nur eine Datei zu ändern?

    Für Könner wahrscheinlich eine Kleinigkeit, aber ich quäe mich schon eine ganze Weile damit rum.

    $file = "C:\temp\aufklebercod\*.COD"
    foreach($str in $file)
    {
        $content = get-content -path $str
    Hier findet meine Dateiveränderung statt.

       $content | set-content $str

    }

    Für Hilfe wäre ich sehr dankbar.

    Cutty

    Montag, 18. März 2013 10:26

Antworten

  • Hast recht Robert ! Heute ist Montag , ich war Feiern ... ;-)

    So müsst es nun gehen:

    # Alle Dateien mit der Dateiendung .COD im Verzeichnis durchlaufen ForEach($Datei in Get-ChildItem 'C:\temp\aufklebercod\*.COD') { # Get-Content liest eine Texdatei Zeile fü Zeile ein # in der Variablen $Zeilen steht deshalb eine Liste von Zeilen (Array) $Zeilen = Get-Content -Path $Datei.Fullname # Die Datei befindet sich nun Komplett im Speicher (in der Variablen $Zeilen) # deshalb können wir die Datei überschreiben # Zeilen Zähler, wird nur gebraucht um die erste Zeile zu erkennen $ZeilenZähler = 1 # jede Zeile abarbeiten foreach($Zeile in $Zeilen) { # Hier findet meine Dateiveränderung statt. # Beispiel: Alle Buchstaben 'a' durch den Buchstaben 'o' ersetzen $Zeile = $Zeile -replace 'a','o' #Veränderte Zeile anzeigen lassen
    Write-Host "Geänderte Zeile in Datei $($Datei.Fullname)" Write-Host $Zeile # Nur bei der ersten Zeile wird die Alte Datei ("leer") neu angelegt (überschrieben)! If($ZeilenZähler -eq 1 ) { Out-File -FilePath $Datei.Fullname -InputObject $Zeile -Force } Else { # jede weiter Zeile an die neue erstellte Datei anhängen (Parameter Append) Out-File -FilePath $Datei.Fullname -InputObject $Zeile -Force -Append } # Zeilenzähler hochsetzen $ZeilenZähler++ } }



    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    • Bearbeitet Peter Kriegel Montag, 18. März 2013 14:23
    • Als Antwort markiert cutty_21 Montag, 18. März 2013 20:40
    Montag, 18. März 2013 14:19

Alle Antworten

  • Willkommen Cutty!

    Man kann es so machen:

    $DateiPfad = 'C:\temp\aufklebercod\*.COD'
    
    
    # Get-Content liest eine Texdatei Zeile fü Zeile ein
    # in der Variablen $Zeilen steht deshalb eine Liste von Zeilen (Array)
    $Zeilen =  Get-Content -Path $DateiPfad
    # Die Datei befindet sich nun Komplett im Speicher (in der Variablen $Zeilen)
    # deshalb können wir die Datei überschreiben
    
    # Zeilen Zähler, wird nur gebraucht um die erste Zeile zu erkennen
    $ZeilenZähler = 1
    
    # jede Zeile abarbeiten
    foreach($Zeile in $Zeilen)
    {
        # Hier findet meine Dateiveränderung statt.
        # Beispiel: Alle Buchstaben 'a' durch den Buchstaben 'o' ersetzen
        $Zeile = $Zeile -replace 'a','o'
        
        #Veränderte Zeile anzeigen lassen
        Write-Host $Zeile
    
        # Nur bei der ersten Zeile wird die Alte Datei ("leer") neu angelegt (überschrieben)!
        If($ZeilenZähler -eq 1 ) {
           Out-File -FilePath $DateiPfad -InputObject $Zeile -Force
        }
        Else {
            # jede weiter Zeile an die neue erstellte Datei anhängen (Parameter Append)
            Out-File -FilePath $DateiPfad -InputObject $Zeile -Force -Append
        }
        
        # Zeilenzähler hochsetzen
        $ZeilenZähler++
    }

    Wenn während der Bearbeitung der Rechner abstürzt ist die Datei versaut!
    Deshalb ist diese Lösung aus dem folgenden Link, noch etwas sicherer. Dort wird eine Temporäre Datei benutzt:
    http://social.technet.microsoft.com/Forums/de-DE/powershell_de/thread/9f5270d0-2c17-4e02-94f5-9ebc60e403f7


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Montag, 18. März 2013 12:19
  • Ich habe die Frage so verstanden, dass jede einzelne Datei gelesen werden soll - einzeln. Und "*" ist ein Platzhalter für alle Dateien *.cod:

    $ile =    Get-ChildItem "C:\temp\aufklebercod\*.COD"
    foreach($str in $file)
    {
        $content = get-content -path $str.versionInfo.Filename
    Hier findet meine Dateiveränderung statt.
    
       $content | set-content $str
    
    }

    Grüße aus Berlin schickt Robert
    MVP Exchange Server
    Montag, 18. März 2013 13:50
  • Hast recht Robert ! Heute ist Montag , ich war Feiern ... ;-)

    So müsst es nun gehen:

    # Alle Dateien mit der Dateiendung .COD im Verzeichnis durchlaufen ForEach($Datei in Get-ChildItem 'C:\temp\aufklebercod\*.COD') { # Get-Content liest eine Texdatei Zeile fü Zeile ein # in der Variablen $Zeilen steht deshalb eine Liste von Zeilen (Array) $Zeilen = Get-Content -Path $Datei.Fullname # Die Datei befindet sich nun Komplett im Speicher (in der Variablen $Zeilen) # deshalb können wir die Datei überschreiben # Zeilen Zähler, wird nur gebraucht um die erste Zeile zu erkennen $ZeilenZähler = 1 # jede Zeile abarbeiten foreach($Zeile in $Zeilen) { # Hier findet meine Dateiveränderung statt. # Beispiel: Alle Buchstaben 'a' durch den Buchstaben 'o' ersetzen $Zeile = $Zeile -replace 'a','o' #Veränderte Zeile anzeigen lassen
    Write-Host "Geänderte Zeile in Datei $($Datei.Fullname)" Write-Host $Zeile # Nur bei der ersten Zeile wird die Alte Datei ("leer") neu angelegt (überschrieben)! If($ZeilenZähler -eq 1 ) { Out-File -FilePath $Datei.Fullname -InputObject $Zeile -Force } Else { # jede weiter Zeile an die neue erstellte Datei anhängen (Parameter Append) Out-File -FilePath $Datei.Fullname -InputObject $Zeile -Force -Append } # Zeilenzähler hochsetzen $ZeilenZähler++ } }



    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    • Bearbeitet Peter Kriegel Montag, 18. März 2013 14:23
    • Als Antwort markiert cutty_21 Montag, 18. März 2013 20:40
    Montag, 18. März 2013 14:19
  • Hallo Peter, hallo Robert, Danke für die schnelle Antwort. Manchmal hat man ja einfach nur ein Brett vorm Kopf. Es war das einfache einfügen von get-childitem in der ersten Zeile. Vielen Dank dafür. Cutty
    Montag, 18. März 2013 20:47