none
Suchen und ersetzen von Text in mehreren Dateien RRS feed

  • Frage

  • Hallo zusammen,

    wir haben hier gerade ein Problem. Wir suchen eine PowerShell Funktion die den Inhalt von mehreren XML Dateien in einem Ordnerpfad sucht und ersetzt. Wir haben schonmal was ausprobiert, klappt aber noch nicht.

    foreach ($file in Get-ChildItem $pfadTB.Text) {
    	Get-Content $pfadTB.Text + "\" + $file | Foreach-Object {$_.Replace($searchTextTB.Text,$replaceTextTB.Text)} | Set-Content $pfadTB.Text + "\" + $file
    
    }


    Viele Grüße aus Stuttgart
    Christian Holzwarth

    Donnerstag, 23. Januar 2014 14:25

Antworten

  • Hallo Christian!

    PowerShell erzeugt und Verarbeitet Objekte keinen Text !

    Du benutzt die Variable $File wie ein Text das geht so nicht!

    Außerdem kann PowerShell hervoragend mit XML Dateien umgehen auch hier ist ein suchen und ersetzen über Textersetzungen zu vermeiden.

    Hier sollte man immer die Möglichkeiten von XML als "Text-Datenbank" benutzen.


    1. Was soll der Komische Pfad $pfadTB.Text ? Lest Ihr den Text aus einer Textbox aus?

    2. haben alle XML Dateien den selben Aufbau? Dann Poste bitte eine Beispiel Datei.
    Wenn nicht dann müssen wir halt Textersetzung benutzen anstatt XML als "Text-Datenbank" benutzen

    3. welche Dateiendungen haben denn die Dateien? Dann kann Get-Childitem die Dateien schon gefiltert nach Dateiendung besorgen!


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Habe es jetzt mittels Textbearbeitung hinbekommen. Allerdings habe ich nun das Problem das mir das Skript den kompletten Aufbau meiner XML Datei zerschiest. Es steht danach (fast) alles in einer Zeile und ist somit nicht mehr als XML Datei erkennbar.

    Mein genutzer Code:

    Get-ChildItem $pfadTB.Text *.xml | 
    	Foreach-Object {
    		$c = ($_ |Get-Content)
    		$c = $c -replace $searchTextTB.Text,$replaceTextTB.Text  
    		[IO.File]::WriteAllText($_.FullName, ($c -join ""))
    	}


    Viele Grüße aus Stuttgart
    Christian Holzwarth

    Ok vergesst es, hab es nun hinbekommen. Habe

    [IO.File]::WriteAllText($_.FullName, ($c))

    mit

    $c | Set-Content $_.FullName

    ersetzt. Und nun läuft es genau so wie es soll. Danke für eure Hilfe.

    Viele Grüße aus Stuttgart
    Christian Holzwarth



    Freitag, 24. Januar 2014 08:42

Alle Antworten

  • Hallo,

    bitte dann naeher erlaeutern was nicht geht, z.B.: Fehlermeldungen posten usw.

    Wenn ich mir deinen Code so betrachte gehe ich davon aus, das du einen Fehler in der Art bekommst, das deine Datei von einem anderen Process genutzt wird?

    Get-Content abc.txt | ForEach-Object {$_ -replace 'XXX', 'YYY'} | Set-Content abc.txt

    Das geht nicht weil bei Get und  Set die gleiche Datei verwendet wird.

    Set-Content : The process cannot access the file 'C:\\scripte\abc.txt' because it is being used by ano
    ther process.
    At line:1 char:78
    + Get-Content abc.txt | ForEach-Object {$_ -replace 'XXX', 'YYY'} | Set-Content <<<<  abc.txt
        + CategoryInfo          : NotSpecified: (:) [Set-Content], IOException
        + FullyQualifiedErrorId : System.IO.IOException,Microsoft.PowerShell.Commands.SetContentCommand

    Das schhn

    Get-Content abc.txt | ForEach-Object {$_ -replace 'XXX', 'YYY'} | Set-Content abc-neu.txt

    Beste Gruesse
    brima


    Donnerstag, 23. Januar 2014 16:02
  • Hallo Christian!

    PowerShell erzeugt und Verarbeitet Objekte keinen Text !

    Du benutzt die Variable $File wie ein Text das geht so nicht!

    Außerdem kann PowerShell hervoragend mit XML Dateien umgehen auch hier ist ein suchen und ersetzen über Textersetzungen zu vermeiden.

    Hier sollte man immer die Möglichkeiten von XML als "Text-Datenbank" benutzen.


    1. Was soll der Komische Pfad $pfadTB.Text ? Lest Ihr den Text aus einer Textbox aus?

    2. haben alle XML Dateien den selben Aufbau? Dann Poste bitte eine Beispiel Datei.
    Wenn nicht dann müssen wir halt Textersetzung benutzen anstatt XML als "Text-Datenbank" benutzen

    3. welche Dateiendungen haben denn die Dateien? Dann kann Get-Childitem die Dateien schon gefiltert nach Dateiendung besorgen!


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Donnerstag, 23. Januar 2014 16:07
  • Hallo Christian!

    PowerShell erzeugt und Verarbeitet Objekte keinen Text !

    Du benutzt die Variable $File wie ein Text das geht so nicht!

    Außerdem kann PowerShell hervoragend mit XML Dateien umgehen auch hier ist ein suchen und ersetzen über Textersetzungen zu vermeiden.

    Hier sollte man immer die Möglichkeiten von XML als "Text-Datenbank" benutzen.


    1. Was soll der Komische Pfad $pfadTB.Text ? Lest Ihr den Text aus einer Textbox aus?

    2. haben alle XML Dateien den selben Aufbau? Dann Poste bitte eine Beispiel Datei.
    Wenn nicht dann müssen wir halt Textersetzung benutzen anstatt XML als "Text-Datenbank" benutzen

    3. welche Dateiendungen haben denn die Dateien? Dann kann Get-Childitem die Dateien schon gefiltert nach Dateiendung besorgen!


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    1. Genau, das ganze wird über eine kleine GUI gehandhabt. In dieser kann man den Pfad der Dateien auswählen.

    2. Nein, die XML Files haben nicht alle denselben Aufbau, allerdings schaffe ich es einfach nicht die Textersetzung zum Laufen zu kriegen. Entweder er durchläuft die Schleife, editiert allerdings nichts. Oder er kommt nichtmal in die Schleife rein.

    3. Dateiendungen sind immer .xml


    Viele Gr&#252;&#223;e aus Stuttgart
    Christian Holzwarth

    Freitag, 24. Januar 2014 07:40
  • Hallo,

    bitte dann naeher erlaeutern was nicht geht, z.B.: Fehlermeldungen posten usw.

    Wenn ich mir deinen Code so betrachte gehe ich davon aus, das du einen Fehler in der Art bekommst, das deine Datei von einem anderen Process genutzt wird?

    Get-Content abc.txt | ForEach-Object {$_ -replace 'XXX', 'YYY'} | Set-Content abc.txt

    Das geht nicht weil bei Get und  Set die gleiche Datei verwendet wird.

    Set-Content : The process cannot access the file 'C:\\scripte\abc.txt' because it is being used by ano
    ther process.
    At line:1 char:78
    + Get-Content abc.txt | ForEach-Object {$_ -replace 'XXX', 'YYY'} | Set-Content <<<<  abc.txt
        + CategoryInfo          : NotSpecified: (:) [Set-Content], IOException
        + FullyQualifiedErrorId : System.IO.IOException,Microsoft.PowerShell.Commands.SetContentCommand

    Das schhn

    Get-Content abc.txt | ForEach-Object {$_ -replace 'XXX', 'YYY'} | Set-Content abc-neu.txt

    Beste Gruesse
    brima


    Genau diese Fehlermeldung erhalte ich, nur wie kann ich diese Sachen in dieselbe Datei schreiben lassen? Der Dateiname soll bzw. darf sich nicht verändern. Lediglich der Inhalt soll ersetzt werden.

    Viele Gr&#252;&#223;e aus Stuttgart
    Christian Holzwarth

    Freitag, 24. Januar 2014 07:51
  • Hallo Christian!

    PowerShell erzeugt und Verarbeitet Objekte keinen Text !

    Du benutzt die Variable $File wie ein Text das geht so nicht!

    Außerdem kann PowerShell hervoragend mit XML Dateien umgehen auch hier ist ein suchen und ersetzen über Textersetzungen zu vermeiden.

    Hier sollte man immer die Möglichkeiten von XML als "Text-Datenbank" benutzen.


    1. Was soll der Komische Pfad $pfadTB.Text ? Lest Ihr den Text aus einer Textbox aus?

    2. haben alle XML Dateien den selben Aufbau? Dann Poste bitte eine Beispiel Datei.
    Wenn nicht dann müssen wir halt Textersetzung benutzen anstatt XML als "Text-Datenbank" benutzen

    3. welche Dateiendungen haben denn die Dateien? Dann kann Get-Childitem die Dateien schon gefiltert nach Dateiendung besorgen!


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Habe es jetzt mittels Textbearbeitung hinbekommen. Allerdings habe ich nun das Problem das mir das Skript den kompletten Aufbau meiner XML Datei zerschiest. Es steht danach (fast) alles in einer Zeile und ist somit nicht mehr als XML Datei erkennbar.

    Mein genutzer Code:

    Get-ChildItem $pfadTB.Text *.xml | 
    	Foreach-Object {
    		$c = ($_ |Get-Content)
    		$c = $c -replace $searchTextTB.Text,$replaceTextTB.Text  
    		[IO.File]::WriteAllText($_.FullName, ($c -join ""))
    	}


    Viele Gr&#252;&#223;e aus Stuttgart
    Christian Holzwarth

    Freitag, 24. Januar 2014 08:23
  • Hallo Christian!

    PowerShell erzeugt und Verarbeitet Objekte keinen Text !

    Du benutzt die Variable $File wie ein Text das geht so nicht!

    Außerdem kann PowerShell hervoragend mit XML Dateien umgehen auch hier ist ein suchen und ersetzen über Textersetzungen zu vermeiden.

    Hier sollte man immer die Möglichkeiten von XML als "Text-Datenbank" benutzen.


    1. Was soll der Komische Pfad $pfadTB.Text ? Lest Ihr den Text aus einer Textbox aus?

    2. haben alle XML Dateien den selben Aufbau? Dann Poste bitte eine Beispiel Datei.
    Wenn nicht dann müssen wir halt Textersetzung benutzen anstatt XML als "Text-Datenbank" benutzen

    3. welche Dateiendungen haben denn die Dateien? Dann kann Get-Childitem die Dateien schon gefiltert nach Dateiendung besorgen!


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Habe es jetzt mittels Textbearbeitung hinbekommen. Allerdings habe ich nun das Problem das mir das Skript den kompletten Aufbau meiner XML Datei zerschiest. Es steht danach (fast) alles in einer Zeile und ist somit nicht mehr als XML Datei erkennbar.

    Mein genutzer Code:

    Get-ChildItem $pfadTB.Text *.xml | 
    	Foreach-Object {
    		$c = ($_ |Get-Content)
    		$c = $c -replace $searchTextTB.Text,$replaceTextTB.Text  
    		[IO.File]::WriteAllText($_.FullName, ($c -join ""))
    	}


    Viele Gr&#252;&#223;e aus Stuttgart
    Christian Holzwarth

    Ok vergesst es, hab es nun hinbekommen. Habe

    [IO.File]::WriteAllText($_.FullName, ($c))

    mit

    $c | Set-Content $_.FullName

    ersetzt. Und nun läuft es genau so wie es soll. Danke für eure Hilfe.

    Viele Grüße aus Stuttgart
    Christian Holzwarth



    Freitag, 24. Januar 2014 08:42