Text in Datei suchen und ersetzen per Batch bzw. Powershell – ganz einfach

Text in Datei suchen und ersetzen per Batch bzw. Powershell

Du musst in vielen Text- oder XML-Dateien bestimmte Textstellen austauschen? Kurz zu meiner Geschichte: Bei einem Kunden musste ich einen Server wechseln auf dem eine XNotar Freigabe lag, nach einem Telefonat mit dem Support meinte dieser man müsse manuell alle Pfade in diversen XML-Dateien wechseln. Eine andere Möglichkeit gäbe es nicht da die Entwickler von XNotar keine Verbesserung diesbezüglich planen.

Es handelte sich bei mir um Rund 30 Dateien in denen ich vereinzelt verschiedenste Änderungen durchführen müsste, würde ich dies händisch machen, wäre ich wohl eine Woche beschäftigt.

Also habe ich ein Skript hierfür geschrieben, welches ich dir hier zur Verfügung stelle. Das Skript durchsucht den Ordner den du unter $ersetzungspfad angegeben hast und sucht sich dort nur die Dateien die du unter „Get-Childitem -Include *.xml,*.txt“ angegeben hast. In diesen Dateien sucht das Skript dann nach den Textpassagen die du unter $search angegeben hast und ersetzt diese mit dem Inhalt, den du unter $replace angegeben hast. Teste dieses Skript erst in einem Testordner, bevor du es produktiv einsetzt.

Schau dir auch meine anderen Beiträge an oder vielleicht willst du wissen wie man eine Active Directory richtig installiert? Lasse einen Kommentar da, wenn dir der Artikel geholfen hat.

30 Gedanken zu „Text in Datei suchen und ersetzen per Batch bzw. Powershell – ganz einfach“

  1. Hi, danke für dein Video. Kannst du mir (uns) vielleicht erklären wie ich eine Eingabe replacen kann?
    Also ich habe einen Text mit dummy1 dummy2 undsoweiter … ich habe 5 Eingabe die der User eingibt. Die dummys sollen gegen die Eingabe ersetzt werden. Wie würde hier der Code ausschauen…?
    Es werden hauptsächlich nur Strings also einzelne Buchstaben oder Sonderzeichen ersetzt…

    Schöne Grüße
    DZ

    Antworten
  2. Cooles Script, gutes Video, Danke
    Kannst du mir bitte behilflich sein, ich möchte gerne alle Anführungszeichen („) ersetzen gegen 2 Apostroph (“). Wie sieht das allgemein bei Sonderzeichen aus?

    Antworten
    • Dafür gibt es mehrer Möglichkeiten, entweder du packst die Anführungszeichen zwischen zwei hochkommas oder du machst vor solchen Sonderzeichen dieses Zeichen

      also also Beispiel „““
      Das dürfte so funktionieren.

      Antworten
  3. Hi Viktor,
    Danke für die gute Idee!!
    ich versuche ein Komma durch ein Semikolon zu ersetzen.
    Pfad ist richtig, die Dateien sind vorhanden.
    Dennoch klappt es nicht, die Batch geht im cmd kurz auf und verschwindet sofort, ohne Ergebnis.
    Hättest du einen Typ für mich?

    Grüße. Martin

    #Pfad in dem die Dateien gescannt werden sollen, der Stern am Ende muss vorhanden sein
    $ersetzungspfad = „D:\xxx\*“

    #Textpassagen die ersetzt werden sollen, kann beliebig erweitert werden
    $search = @(„,“)
    #Der Inhalt der die oben genannten Textpassagen überschreiben soll, ACHTUNG muss in gleicher Reihenfolge sein.
    $replace = @(„;“)

    ##################################################################################################
    #Abfrage ob du die Reihenfolgen richtig hast, hier kannst du prüfen ob alles korrekt ersetzt wird#

    $i=0 #Hilfsvariable
    foreach ($s in $search){ #Schleife die ausgibt, was mit welchem Wert ersetzt werden soll
    Write-Host „Du willst“$s „mit “ $replace[$i] “ ersetzen“
    $i++}
    $alles_korrekt = Read-Host -Prompt „Ist alles richtig? y/n“ #Abfrage ob alles korrekt eingetragen wurde

    ##################################################################################################
    ###################################Der Ersetzungsvorgang##########################################

    $i=0 #Hilfsvariable
    if($alles_korrekt -ieq „y“){ #wenn oben alles korrekt war und mit y geantwortet wurde beginnt der Vorgang
    foreach ($s in $search){
    Get-ChildItem -Path $ersetzungspfad -Include *.csv,*.properties| Foreach-Object {Get-Content $_ | Out-String | Foreach-Object {$_.Replace($s,$replace[$i])} | Set-Content $_}
    $i++}}

    Antworten
    • Ja auf jeden Fall würde ich das über die powershell ise machen um zu schauen ob er denn einen Fehler wirft und es ist ja keine Batch sondern eine powershell Datei. Also *.ps1

      Antworten
    • Hallo, dein sricpt ist super es funktioniert auch aber, ich habe ein Problem ich möchte ein spiel übersetzen, abertausende Sachen umbenennen wenn ich dann solche Zeichen benutze „∂ 𠪓 kommt im fertigen File nur ein „?“ heraus, wie ist es möglich das Problem zu beheben. ?

      MFG

      Antworten
      • Hey Ben, das Problem dürfte hier aber nicht an Powershell selbst liegen. Hat dein Rechner denn diese griechischen Buchstaben installiert? Denn es sollte ja auch ein normaler String sein, nur kennt dein Rechner diese Buchstaben evtl. Nicht

        Antworten
  4. Hallo Viktor,

    danke für das Video. Top! hilft mir wirklich sehr weiter.

    Ich muss das Script aber 2x laufen lassen um den 3ten Eintrag in einer Zeile zu ersetzen.

    Bsp.: eine Zeile aus den CSV Dateien im Ordner:
    xx;PU11H;C;x;ED;PU11H;PU11H;133;

    Ich suche mit Deinem Script nach „;PU11H;“ und ersetze es mit „;PU11H19-01;“

    Ergebnis:
    xx;PU11H19-01;C;x;ED;PU11H19-01;PU11H;133;

    Kannst du mir helfen damit auch der 3te Eintrag ersetzt wird, ohne das ich das Script 2x laufen lassen muss?

    Danke & Grüße, Oliver

    Antworten
  5. Hallo Viktor,

    Vielen Dank für das Skript.
    Ich versuche in einer Datei, den String “ -WjBeginn:20220101 “ so zu ersetzen, dass nach jedem Skriptdurchlauf immer das aktuelle Jahr vom Systemdatum drin steht.
    Also in diesem Jahr “ -WjBeginn:20220101 „, nächstes Jahr “ -WjBeginn:20230101 „, usw…
    Kann mir jemand dabei helfen?

    Vielen Dank,

    Gruß Wolfgang

    Antworten
  6. Hallo Viktor

    Cooles Script !!!

    Wie kann das Script angepasst werden, wenn ich darunter noch Unterordner habe und die ebenfalls durchsucht werden sollen?

    Ich danke dir für ein Feedback.

    Liebe Grüsse
    Peter

    Antworten
    • klar … 🙂

      $i=0 #Hilfsvariable
      if($alles_korrekt -ieq „y“){ #wenn oben alles korrekt war und mit y geantwortet wurde beginnt der Vorgang
      foreach ($s in $search){
      Get-ChildItem -Path $ersetzungspfad -Recurse -Include *.ini,*.cfg,*.txt| Foreach-Object {Get-Content $_ | Out-String | Foreach-Object {$_.Replace($s,$replace[$i])} | Set-Content $_}
      $i++}}

      LG Peter

      Antworten
  7. Hallo Viktor,
    ich danke Dir für Dein Skript. Genau das brauche ich.
    Ich hatte Probleme, weil in dem Skript oben
    $replace[$i] falsch geschrieben ist:
    $replace[$i]. Bitte ändere das doch , damit mehr „Gefällt mir“ angeklickt wird.
    Als Anfänger habe ich lange gebraucht, bis ich es raus hatte.

    Ich habe noch ein Problem :
    Ich muss eine xml-Datei aufbereiten
    ich möchte das “ mitten im Ausdruck mitfinden und mitersetzen
    account_no=“45000
    ersetzen durch
    account_no=“4400

    $search = @(“ account_no='“45000″)
    $replace = @(“ account_no=“4400″) geht leider nicht

    Kannst Du mir die Zeilen so aufschreiben, dass es einfach copy and paste machen kann. Mir wäre die Funktion eine Spende von 30 Euro wert.

    So sehen die Zeilen in der xml-Datei aus:

    Antworten
  8. Hallo,
    das mit dem suchen und ersetzten hab ich schon eingesetzt.

    Jetzt hab ich eine Datei in der folgendes geändert werden muß:

    Suche eine Zeile die mit „H100“ anfängt, wenn nächste Zeile mit „I00“ anfängt suche nächste Zeile die mit „H100“ anfängt.
    wenn nächste Zeile nicht mit „I00“ anfängt geh zum ende der Zeile füge ein Leerzeichen ein und entferne Zeilenumbruch
    Das mach so lange bis nächste Zeile mit „I00“ anfängt

    Ist sowas möglich mit Powershell ?

    Vielleicht kann mir jemand helfen wenn es möglich ist

    Gruß
    Peter

    Antworten
  9. Das Script hört sich gut an, aber bekomme Fehler:

    In Zeile:19 Zeichen:45
    + Write-Host „Du willst“$s „mit “ $replace[$i] “ ersetzen“
    + ~
    Das kaufmännische Und-Zeichen (&) ist nicht zulässig. Der &-Operator ist für eine zukünftige Verwendung reserviert. Verwenden Sie das kaufmännische Und-Zeichen in
    doppelten Anführungszeichen („&“), um es als Teil einer Zeichenfolge zu übergeben.
    In Zeile:30 Zeichen:158
    + … tent $_ | Out-String | Foreach-Object {$_.Replace($s,$replace[$i] …
    + ~
    „)“ fehlt in einem Methodenaufruf.
    In Zeile:30 Zeichen:158
    + … ent $_ | Out-String | Foreach-Object {$_.Replace($s,$replace[$i]) …
    + ~
    Unerwartetes Token „&“ in Ausdruck oder Anweisung.
    In Zeile:30 Zeichen:158
    + … ent $_ | Out-String | Foreach-Object {$_.Replace($s,$replace[$i]) …
    + ~
    Ausdruck nach „&“ fehlt im Pipelineelement.
    In Zeile:30 Zeichen:135
    + … oreach-Object {Get-Content $_ | Out-String | Foreach-Object {$_.Repla …
    + ~
    Die schließende „}“ fehlt im Anweisungsblock oder der Typdefinition.
    In Zeile:28 Zeichen:28
    + if($alles_korrekt -ieq „y“){ #wenn oben alles korrekt war und mit y g …
    + ~
    Die schließende „}“ fehlt im Anweisungsblock oder der Typdefinition.
    + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : AmpersandNotAllowed

    Antworten
  10. Leider erhalte ich folgende Fehlermeldungen:

    In Zeile:19 Zeichen:45
    + Write-Host „Du willst“$s „mit “ $replace[$i] “ ersetzen“
    + ~
    Das kaufmännische Und-Zeichen (&) ist nicht zulässig. Der &-Operator ist für eine zukünftige Verwendung reserviert. Verwenden Sie das kaufmännische Und-Zeichen in doppelten Anführungszeichen („&“), um es als Teil einer Zeichenfolge zu übergeben.
    In Zeile:30 Zeichen:158
    + … tent $_ | Out-String | Foreach-Object {$_.Replace($s,$replace[$i] …
    + ~
    „)“ fehlt in einem Methodenaufruf.
    In Zeile:30 Zeichen:158
    + … ent $_ | Out-String | Foreach-Object {$_.Replace($s,$replace[$i]) …
    + ~
    Unerwartetes Token „&“ in Ausdruck oder Anweisung.
    In Zeile:30 Zeichen:158
    + … ent $_ | Out-String | Foreach-Object {$_.Replace($s,$replace[$i]) …
    + ~
    Ausdruck nach „&“ fehlt im Pipelineelement.
    In Zeile:30 Zeichen:135
    + … oreach-Object {Get-Content $_ | Out-String | Foreach-Object {$_.Repla …
    + ~
    Die schließende „}“ fehlt im Anweisungsblock oder der Typdefinition.
    In Zeile:28 Zeichen:28
    + if($alles_korrekt -ieq „y“){ #wenn oben alles korrekt war und mit y g …
    + ~
    Die schließende „}“ fehlt im Anweisungsblock oder der Typdefinition.
    + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : AmpersandNotAllowed

    Außer dem Ersetzungspfad habe ich im Script nichts verändert.

    Antworten
    • Es ist ein Problem mit der Darstellung des Skripts z.B. hier im Browser, wir kopieren alle fleißig das Skript mit:
      $replace[$i]
      das [ soll aber eigentlich eine „Eckige Klammer Auf“ sein…
      das an den entsprechenden Stellen korrigieren zu
      $replace[$i]
      sieht dann auch gleich viel freundlicher aus 😉

      Grüße Kay

      Antworten
  11. Hallo,
    ich muss in einer XML-Datei Einträge ersetzen.
    Dazu muss ich z. B. den Text zwischen und finden und ersetzen. Hast du dafür eine Lösung?

    Grüße, Ralf

    Antworten

Schreibe einen Kommentar