PowerShell Text Replace

emeriks
Goto Top
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
<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
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.

Content-Key: 1539578309

Url: https://administrator.de/contentid/1539578309

Ausgedruckt am: 16.08.2022 um 23:08 Uhr

Mitglied: Doskias
Doskias 22.11.2021 um 13:11:23 Uhr
Goto Top
Moin,

ich hab es grade mal versucht nachzubauen, war aber zu Faul und hab einfach folgendes gemacht:

So funktioniert es bei mir face-smile

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 face-smile

Gruß
Doskias
Mitglied: 149569
149569 22.11.2021 aktualisiert um 13:19:48 Uhr
Goto Top
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!
Mitglied: K-Man2000
K-Man2000 22.11.2021 um 13:22:44 Uhr
Goto Top
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"/>
Mitglied: emeriks
emeriks 22.11.2021 um 13:26:21 Uhr
Goto Top
Zitat von @K-Man2000:
Auch wenn Du das von einer XML im UTF-8 mit Get-Content einliest?
Mitglied: emeriks
emeriks 22.11.2021 um 13:27:42 Uhr
Goto Top
Zitat von @149569:
Ganz so einfach ist das leider nicht. Ich muss den ganzen Text so wie angegeben prüfen, weil es andere Kombinationen gibt, in welchen nicht ersetzt werden darf.
Mitglied: Doskias
Doskias 22.11.2021 um 13:44:54 Uhr
Goto Top
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.
Mitglied: K-Man2000
K-Man2000 22.11.2021 um 13:47:17 Uhr
Goto Top
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 face-smile

$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.
Mitglied: 149569
149569 22.11.2021 aktualisiert um 17:13:48 Uhr
Goto Top
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:

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
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.
Mitglied: emeriks
emeriks 23.11.2021 um 14:19:04 Uhr
Goto Top
Danke erst mal an Euch, für Eure Mühe.
Es hat echt nicht funktioniert. Was auch immer ich versucht hatte.

Ich habe es dann schnell mal im VB.Net zusammengeklimpert und damit lief es dann im ersten Anlauf. Bei selben Dateien und selben Suchtexten wie im PS verwendet.