PowerShell, Text zwischen zwei Strings ersetzen
Hallo,
ich komme mit PowerShell leider noch nicht so gut zurecht und brauche daher eure Hilfe.
Bei uns wird etwas aus dem AD exportiert und an anderer Stelle importiert. Beim Export wird eine Textdatei erzeugt, die dann geändert werden muss. Konkret muss immer alles geändert werden, was mit "OU=" anfängt und mit "DC=intern" aufhört (einschließlich der genannten Zeichen).
Beispieldatensatz:
Daraus soll entstehen:
Der Pfad (hier im Beispiel "OU=Benutzer,OU=Berlin,") kann sich ändern, es kann auch "Moskau", "London" oder sonst was sein. Es könnte auch statt "Benutzer" "OU=Deaktivierte,OU=Benutzer" oder weitere Verschachtelungen stehen.
Bisher habe ich mit Replace gearbeitet, aber da muss ich das, was ich ersetzen will exakt eingeben; wird irgendeine Änderung durchgeführt, passt das Skript nicht mehr:
In meinem bisherigen Skript sind also zig Zeilen, mit deren Hilfe ich versuche jeden möglichen Fall abzufangen.
Sinnvoller wäre daher ein Skript, das in etwa so wäre:
Suche mir den String, der mit "CN=" anfängt und mit "DC=intern" aufhört. Ersetze diesen String durch "OU=Kontakte,DC=transfer,DC=local".
Ich bin schon eine ganze Weile am googeln, es gibt auch einige, die ein ähnliches Problem haben, aber ich krieg es nicht so umgesetzt, dass es bei mir funktioniert.
Kann mir jemand behilflich sein?
PS: Die Textdatei enthält natürlich nicht nur einen solchen Datensatz, sondern mehrere.
Viele Grüße,
ich komme mit PowerShell leider noch nicht so gut zurecht und brauche daher eure Hilfe.
Bei uns wird etwas aus dem AD exportiert und an anderer Stelle importiert. Beim Export wird eine Textdatei erzeugt, die dann geändert werden muss. Konkret muss immer alles geändert werden, was mit "OU=" anfängt und mit "DC=intern" aufhört (einschließlich der genannten Zeichen).
Beispieldatensatz:
dn: CN=Mustermensch\, Maxi,OU=Benutzer,OU=Berlin,DC=firma,DC=intern
changetype: add
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
cn: Mustermensch, Maxi
sn: Mustermensch
l: Berlin
st: Rheinland-Pfalz
postalCode: 08151
telephoneNumber: +49 (0815) 12345 - 67
givenName: Maxi
company: Firma
streetAddress:: Hauptstr
wWWHomePage: https://www.firma.de/
mail: Maxi.Mustermensch@firma.de
Daraus soll entstehen:
CN=Mustermensch\, Maxi,OU=Kontakte,DC=transfer,DC=local
changetype: add
objectClass: top
...
Der Pfad (hier im Beispiel "OU=Benutzer,OU=Berlin,") kann sich ändern, es kann auch "Moskau", "London" oder sonst was sein. Es könnte auch statt "Benutzer" "OU=Deaktivierte,OU=Benutzer" oder weitere Verschachtelungen stehen.
Bisher habe ich mit Replace gearbeitet, aber da muss ich das, was ich ersetzen will exakt eingeben; wird irgendeine Änderung durchgeführt, passt das Skript nicht mehr:
(Get-Content C:\Import.ldf) | ForEach-Object { $_ -replace "OU=Benutzer,OU=Berlin,DC=firma,DC=intern", "OU=Kontakte,DC=transfer,DC=local" } | Set-Content C:\ImportEdit.ldf
Sinnvoller wäre daher ein Skript, das in etwa so wäre:
Suche mir den String, der mit "CN=" anfängt und mit "DC=intern" aufhört. Ersetze diesen String durch "OU=Kontakte,DC=transfer,DC=local".
Ich bin schon eine ganze Weile am googeln, es gibt auch einige, die ein ähnliches Problem haben, aber ich krieg es nicht so umgesetzt, dass es bei mir funktioniert.
Kann mir jemand behilflich sein?
PS: Die Textdatei enthält natürlich nicht nur einen solchen Datensatz, sondern mehrere.
Viele Grüße,
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 519010
Url: https://administrator.de/forum/powershell-text-zwischen-zwei-strings-ersetzen-519010.html
Ausgedruckt am: 23.12.2024 um 16:12 Uhr
5 Kommentare
Neuester Kommentar
Bisher habe ich mit Replace gearbeitet, aber da muss ich das, was ich ersetzen will exakt eingeben;
Nein musst du nicht, -replace arbeitet mit Regular Expressions und für die ist das ein Kinderspiel (gc 'C:\Import.ldf') -replace '(^dn:\s*CN=.*?)(?=,OU=).*','$1,OU=Kontakte,DC=transfer,DC=local' | sc ' C:\Import.ldf'
(^dn:\s*CN=.*?)
Das sucht am Zeilenanfang(^) nach dem String "dn:" mit folgenden nicht zwingendem Leerzeichen, worauf der String "CN=" gefolgt von beliebigen Zeichen (non greedy (?)) kommen kann. Das ganze Konstrukt speichern wir durch die umschließenden Klammern in einem Submatch den wir hinterher im Replacement mit $ und der entsprechenden Submatch Nummer ansprechen können(?=,OU=).
Dieses Konstrukt nennt sich Positive Lookahead und sucht nach dem ersten Auftreten des Strings ",OU=" der als Begrenzer zum CN dient..*
Das matcht den Rest der Zeile der soll ja sowieso komplett ersetzt werdenDer Replacement-String:
$1,OU=Kontakte,DC=transfer,DC=local
... baut aus dem ersten Submatch des Regex (erstes Klammerpaar) und dem festen String das Replacement des Regex zusammen.