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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
##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.
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
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?
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.
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++}}
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
Alles klar,
vielen Dank.
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
Genaugenommen bräuchte ich, π ⌡ Π fi fl ≥
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
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
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
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
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
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:
es steht im Skript bei replace ein Zeichen mit „93“
das liegt bei dir wahrscheinlich an den Gänsefüsschen. Versuche mal @(‚account_no=“4500″‚)
WordPress hat leider das falsche Zeichen eingetzt ich meine damit das Apostroph
Vielen Dank!
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
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
hmmm… hier kommt nix mehr.
Schade
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.
Kann gelöscht werden, habe den Fehler gefunden!
Und wo liegt der Fehler?
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
So,
hier ist nicht ganz ersichtlich was ich meine…
jedenfalls, die Zeichenfolge & # 9 1 ; im Skript soll eine [ sein.
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
“ und “ meine ich
ok! 3. Versuch
Den Wert für einen XML-Tag also zwischen „Arbeitgebername1> und </Arbeitgebername1"