jenny82
Goto Top

PS: Suchen und ersetzen in Dateien mit Sonderzeichen und bis zu einem bestimmten Zeichen + Wert um 1 erhöhen

Hallo zusammen,

folgenden Powershell-Code habe ich bereits und funktioniert so ansich auch:

$Ersetzen = @{"Suche1"="Ersetzen1";"Suche2"="Ersetzen2";"Suche3"="Ersetzen3"}  

gci "C:\test\*.txt" | %{  
    $content = gc $_.Fullname | out-string
    $Ersetzen.GetEnumerator() | %{$content = $content.Replace($_.Key,$_.Value)}
    $content | sc $_.Fullname
}

nun zu meinen Problemen bzw. Herausforderungen:

Suche1 = Ersetzen1 ist normaler Text und funktioniert
Suche2 = Ersetzen2 hat folgende Sonderzeichen: ' und + und soll folgendes machen :
'DTM+7 als fixer Text und darauf folgende beliebige Zeichen bis ALF sollen gelöscht bzw. ersetzt werden
Bsp.: Suche2 'DTM+7*'ALF = Ersetzen2 'ALF
Bsp.: Suche2 'DTM+74356746456456'ALF = Ersetzen2 'ALF
Bsp.: Suche2 'DTM+abcdg645xxx6'ALF = Ersetzen2 'ALF
Suche3 = Ersetzen3 hier soll ein bestimmter Text und Sonderzeichen + und dann eine darauf folgende Zahl um den Wert 1 erhöht werden
Bsp.: Suche3 'END+123 = Ersetzen3 'END+124
Bsp.: Suche3 'END+12348 = Ersetzen3 'END+12349

Desweiteren sollen die Dateien im Anschluss überschrieben werden, jedoch das Dateidatum ( Geändert am - lastwritetime ) beibehalten werden.

Ich hoffe dies ist so überhaupt möglich und dass mir hier jemand helfen kann.
Wäre sehr dankbar.

LG Jenny

Content-ID: 332781

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

Ausgedruckt am: 25.11.2024 um 08:11 Uhr

132692
132692 22.03.2017 aktualisiert um 10:32:21 Uhr
Goto Top
Beschäftige dich mal mit Regular Expressions und dem -replace Operator, damit ist das kein Problem.
Bei Interesse an fertigen Code -> gerne PN mit Angebot anfordern face-smile

Gruß p.
colinardo
colinardo 24.03.2017 aktualisiert um 10:47:18 Uhr
Goto Top
Servus Jenny,
da machst du besser zwei separate Ersetzungstasks in der Schleife draus da es doch zwei sehr unterschiedliche Ersetzungs-Anforderungen sind.
$Ersetzen = @{"Suche1"="Ersetzen1";"Suche2"="Ersetzen2";"Suche3"="Ersetzen3"}  
gci "C:\test\*.txt" | ?{!$_.PSIsContainer} | %{  
    # save LastWriteTime to variable
    $timeorig = $_.LastWriteTime
    # get content of file
    $content = gc $_.Fullname -raw
    # normal replacements
    $Ersetzen.GetEnumerator() | %{$content = $content.Replace($_.Key,$_.Value)}
    # Special Replace 1
    $content = $content -replace "'DTM\+7.*?('ALF)",'MEIN_ERSATZ_HIER$1'  
    # Special Replace 2 with number increase
    $content = [regex]::replace($content,"'END\+(\d+)",{param($m) return "'END+$([decimal]$m.Groups[1].Value + 1)"})  
    # write new content
    $content | sc $_.Fullname
    # reset LastWriteTime to original
    $_.LastWriteTime = $timeorig
}
Soweit meine Interpretation die ich aus der etwas wirren Schilderung herauslesen konnte.

Falls du dich fragst was das in Zeile 12 für ein Konstrukt ist, das ist ein sogenannter MatchEvaluator, der jeden RegularExpression-Match direkt durch eine Funktion schickt welche den Match verarbeiten kann.
https://msdn.microsoft.com/de-de/library/ht1sxswy(v=vs.110).aspx
Das nutze ich hier aus um den Wert der Zahl direkt erhöhen zu können, ohne erst den Match aufwändig in einer Variable zu speichern, die Zahl umzuwandeln, zu erhöhen und dann zu ersetzen. So geschieht das alles in einem Aufwasch face-smile.

Grüße Uwe