PowerShell Text Replace
Hi,
wie bekommt man PowerShell dazu, nicht zu denken? Sondern einfach zu machen. So wie BASIC aus dem Jahr 1982?
Ich will in einem XML-File, welches UTF-8 kodiert ist, Text ersetzen. Das Problem ist nicht, das wieder in UTF-8 zu speichern. Sondern ich bekomme es einfach nicht gebacken, dass PS den Suchtext überhaupt findet. Weder mit "replace" noch mir "contains".
Ersetzt werden soll eine Textpassage wie
Ich habe es versucht mit
Macht er nicht.
Dann
Da meckert er irgendwas von RegEx. RegEx will ich nicht.
Selbst
oder
liefern False.
Es ist auch egal, ob ich das XML-File als String-Array oder als einzelnen String einlese. Und es liegt auch kein Problem mit Groß/Kleinschreibung vor, oder mit Umlauten oder Leerzeichen oder Zeilenumbrüchen.
Warum einfach, wenn es doch auch so schön powershellkompliziert geht ...
Kann mir jemand bitte weiterhelfen?
Muss ich das wirklich erst in .Net programmieren?
E.
wie bekommt man PowerShell dazu, nicht zu denken? Sondern einfach zu machen. So wie BASIC aus dem Jahr 1982?
Ich will in einem XML-File, welches UTF-8 kodiert ist, Text ersetzen. Das Problem ist nicht, das wieder in UTF-8 zu speichern. Sondern ich bekomme es einfach nicht gebacken, dass PS den Suchtext überhaupt findet. Weder mit "replace" noch mir "contains".
Ersetzt werden soll eine Textpassage wie
<FilterGroup bool="AND" not="0" name="DOMAIN\GROUP_A" sid="S-1-5-21-1111111111-2222222222-3333333333-35214" userContext="0" primaryGroup="0" localGroup="0"/>
durch<FilterGroup bool="AND" not="0" name="DOMAIN\GROUP_B" sid="S-1-5-21-1111111111-2222222222-3333333333-35555" userContext="0" primaryGroup="0" localGroup="0"/>
Der Text liegt ohne Zeilenumbruch vor.Ich habe es versucht mit
$x.Replace($SearchText, $ReplaceText)
Dann
$x -replace $SearchText, $ReplaceText
Selbst
$x.Contains($SearchText)
$x -contains $SearchText
Es ist auch egal, ob ich das XML-File als String-Array oder als einzelnen String einlese. Und es liegt auch kein Problem mit Groß/Kleinschreibung vor, oder mit Umlauten oder Leerzeichen oder Zeilenumbrüchen.
Warum einfach, wenn es doch auch so schön powershellkompliziert geht ...
Kann mir jemand bitte weiterhelfen?
Muss ich das wirklich erst in .Net programmieren?
E.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1539578309
Url: https://administrator.de/forum/powershell-text-replace-1539578309.html
Ausgedruckt am: 31.03.2025 um 14:03 Uhr
9 Kommentare
Neuester Kommentar
Moin,
ich hab es grade mal versucht nachzubauen, war aber zu Faul und hab einfach folgendes gemacht:
So funktioniert es bei mir 
Wie sieht denn der ganze Code bei dir aus? Sprich:
- Wie liest du die Datei ein?
- Wie definierst du $SearchText bzw. $ReplaceText?
- Steht nur diese eine Zeile in der XML-Datei oder noch mehr?
Dann würde ich das ganze mal "ordentlich" nachbauen
Gruß
Doskias
ich hab es grade mal versucht nachzubauen, war aber zu Faul und hab einfach folgendes gemacht:
$x='<FilterGroup bool="AND" not="0" name="DOMAIN\GROUP_A" sid="S-1-5-21-1111111111-2222222222-3333333333-35214" userContext="0" primaryGroup="0" localGroup="0"/>'
$SearchText='35214'
$ReplaceText='35555'
$x=$x -replace $SearchText, $ReplaceText
Wie sieht denn der ganze Code bei dir aus? Sprich:
- Wie liest du die Datei ein?
- Wie definierst du $SearchText bzw. $ReplaceText?
- Steht nur diese eine Zeile in der XML-Datei oder noch mehr?
Dann würde ich das ganze mal "ordentlich" nachbauen
Gruß
Doskias

Ach watt, das was du da hast ist ja schon in XML und das lässt man am besten gleich durch einen Parser laufen und bearbeitet es als Objekt ...
Wenn du rein String-Ersetzung machen willst hier dein Beispiel:
Immer dran denken -replace arbeitet mit Regular Expressions!
$string = '<FilterGroup bool="AND" not="0" name="DOMAIN\GROUP_A" sid="S-1-5-21-1111111111-2222222222-3333333333-35214" userContext="0" primaryGroup="0" localGroup="0"/>'
$xml = [xml]$string
$xml.FilterGroup.name = $xml.FilterGroup.name -replace 'GROUP_A','GROUP_B'
$xml.FilterGroup.sid = $xml.FilterGroup.sid -replace '\d+$','35555'
$xml.OuterXml
Wenn du rein String-Ersetzung machen willst hier dein Beispiel:
$string = '<FilterGroup bool="AND" not="0" name="DOMAIN\GROUP_A" sid="S-1-5-21-1111111111-2222222222-3333333333-35214" userContext="0" primaryGroup="0" localGroup="0"/>'
$string -replace '(?<=DOMAIN\\)GROUP_A(.*?-)\d+(?=")','GROUP_B${1}35555'
Founktioniert auch mit $x.Replace($SearchText, $ReplaceText):
$x = '<FilterGroup bool="AND" not="0" name="DOMAIN\GROUP_A" sid="S-1-5-21-1111111111-2222222222-3333333333-35214" userContext="0" primaryGroup="0" localGroup="0"/>'
$SearchText = 'GROUP_A'
$ReplaceText = 'GROUP_B'
$x = $x.Replace($SearchText, $ReplaceText)
$x
liefert dann:
<FilterGroup bool="AND" not="0" name="DOMAIN\GROUP_B" sid="S-1-5-21-1111111111-2222222222-3333333333-35214" userContext="0" primaryGroup="0" localGroup="0"/>
$x = '<FilterGroup bool="AND" not="0" name="DOMAIN\GROUP_A" sid="S-1-5-21-1111111111-2222222222-3333333333-35214" userContext="0" primaryGroup="0" localGroup="0"/>'
$SearchText = 'GROUP_A'
$ReplaceText = 'GROUP_B'
$x = $x.Replace($SearchText, $ReplaceText)
$x
liefert dann:
<FilterGroup bool="AND" not="0" name="DOMAIN\GROUP_B" sid="S-1-5-21-1111111111-2222222222-3333333333-35214" userContext="0" primaryGroup="0" localGroup="0"/>
Also ich hab das jetzt mal wie folgt versucht nachzustellen:
1. Via Notepad eine XML-Datei im UTF-8 Format erstellt. Inhalt, deine Zeile:
2. Skript
Ergebnis:
Zeile 1 liest die Datei ohne Veränderung aus
Zeile 4 Ersetz wie geplant die Werte aus Zeile 2 und 3
Also dein Problem, dass es nicht gefunden werden kann, kann ich so erstmal nicht nachvollziehen.
1. Via Notepad eine XML-Datei im UTF-8 Format erstellt. Inhalt, deine Zeile:
2. Skript
$x=Get-Content C:\Temp\utf8.xml
$SearchText='35214'
$ReplaceText='35555'
$x=$x.Replace($SearchText, $ReplaceText)
Zeile 1 liest die Datei ohne Veränderung aus
Zeile 4 Ersetz wie geplant die Werte aus Zeile 2 und 3
Also dein Problem, dass es nicht gefunden werden kann, kann ich so erstmal nicht nachvollziehen.
Zitat von @emeriks:
Zitat von @K-Man2000:
Auch wenn Du das von einer XML im UTF-8 mit Get-Content einliest?Also bei mir: Ja
$x = get-content -Path '.\new 5.xml'
$x
$SearchText = 'GROUP_A'
$ReplaceText = 'GROUP_B'
$x = $x.Replace($SearchText, $ReplaceText)
$x
Funktioniert.
Hatte die XML (UTF-8) vorher in Notepad++ erstellt und dein Textbeispiel eingefügt.

Nur noch zur Info, die Replace(String, String) Funktion aus dem NET Framework ist Case-Sensitive und beim Operator -replace muss natürlich Regex-Syntax verwendet werden! Wenn man hier also Variablen übergibt sollte man die Strings Escapen mittels
Was dann hierzu führt:
Man sollte wenn aber wenn man Probleme hat das Encoding bei Get-Content mit angeben
Nur falls das Encoding von der PS missinterpretiert wird.
Besser wäre wie gesagt den XML-Teil direkt in einen [XML] Document zu laden und mittesl Load() Methode zu laden, denn dann erkennt das Objekt das Encoding anhand der XML-Declaration.
[regex]::escape($SearchText)
$result = $x -replace [regex]::escape($SearchText), $ReplaceText
Auch wenn Du das von einer XML im UTF-8 mit Get-Content einliest?
Das spielt keine Rolle, die Powershell läuft Standardmäßig in UTF16 inkludiert also alles was UTF8 definiert.Man sollte wenn aber wenn man Probleme hat das Encoding bei Get-Content mit angeben
Get-Content D:\datei.txt -Encoding UTF8
Besser wäre wie gesagt den XML-Teil direkt in einen [XML] Document zu laden und mittesl Load() Methode zu laden, denn dann erkennt das Objekt das Encoding anhand der XML-Declaration.