emeriks
Goto Top

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
<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)
Macht er nicht.
Dann
$x -replace $SearchText, $ReplaceText
Da meckert er irgendwas von RegEx. RegEx will ich nicht.
Selbst
$x.Contains($SearchText)
oder
$x -contains $SearchText 
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

Printed on: April 26, 2024 at 09:04 o'clock

Member: Doskias
Doskias Nov 22, 2021 at 12:11:23 (UTC)
Goto Top
Moin,

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
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 Nov 22, 2021 updated at 12:19:48 (UTC)
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 ...
$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'  
Immer dran denken -replace arbeitet mit Regular Expressions!
Member: K-Man2000
K-Man2000 Nov 22, 2021 at 12:22:44 (UTC)
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"/>
Member: emeriks
emeriks Nov 22, 2021 at 12:26:21 (UTC)
Goto Top
Zitat von @K-Man2000:
Auch wenn Du das von einer XML im UTF-8 mit Get-Content einliest?
Member: emeriks
emeriks Nov 22, 2021 at 12:27:42 (UTC)
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.
Member: Doskias
Doskias Nov 22, 2021 at 12:44:54 (UTC)
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
$x=Get-Content C:\Temp\utf8.xml
$SearchText='35214'  
$ReplaceText='35555'  
$x=$x.Replace($SearchText, $ReplaceText)
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.
Member: K-Man2000
K-Man2000 Nov 22, 2021 at 12:47:17 (UTC)
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 Nov 22, 2021 updated at 16:13:48 (UTC)
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
[regex]::escape($SearchText)
Was dann hierzu führt:
$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
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.
Member: emeriks
emeriks Nov 23, 2021 at 13:19:04 (UTC)
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.