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:
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 332781
Url: https://administrator.de/contentid/332781
Ausgedruckt am: 25.11.2024 um 08:11 Uhr
2 Kommentare
Neuester Kommentar
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
Gruß p.
Bei Interesse an fertigen Code -> gerne PN mit Angebot anfordern
Gruß p.
Servus Jenny,
da machst du besser zwei separate Ersetzungstasks in der Schleife draus da es doch zwei sehr unterschiedliche Ersetzungs-Anforderungen sind.
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 .
Grüße Uwe
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
}
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 .
Grüße Uwe