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.

##Skript um Textstellen in vielen Dateien zu ändern
##Autor Viktor Kosilov
##Datum 12.06.2020
##Webseite kosilov.de

#Pfad in dem die Dateien gescannt werden sollen, der Stern am Ende muss vorhanden sein
$ersetzungspfad = "C:\Users\Administrator\Desktop\test\Xnotar_dateien\*"

#Textpassagen die ersetzt werden sollen, kann beliebig erweitert werden 
$search = @("abc","123","xyz","456","def")
#Der Inhalt der die oben genannten Textpassagen überschreiben soll, ACHTUNG muss in gleicher Reihenfolge sein.
$replace = @("xxx","xxx","xxx","xxx","xxx")

##################################################################################################
#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 *.xml,*.properties| Foreach-Object {Get-Content $_ | Out-String | Foreach-Object {$_.Replace($s,$replace[$i])} | Set-Content $_}
        $i++}}
    
    

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.

7 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

Schreibe einen Kommentar