Flexibles Replace dank MatchEvaluator

Eine simple Anforderung soll (unbedingt;) per Regex gelöst werden: Der Ersatz einer Umgebungsvariablen in der alten Schreibweise aus einer Pfadangabe.

Beispiel:

Aus einem %temp%\test123 soll %temp% durch den Pfad des temp-Verzeichns im Benutzerprofil ersetzt werden.

Das Problem: Der Replace-Operator ermöglicht keine Ausdrücke in dem Einsetzwert.

Der folgende Befehl ersetzt lediglich %temp% durch temp:

"%temp%\test1234.dat" -replace "%(\w+)%", '$1'

Statt „temp“ soll z.B. [Environment]::GetEnvironment(Variable($1) eingesetzt werden.

Auch wenn ich einiges ausprobiert hatte, der zweite Wert darf nur aus $1, $S2 usw. bestehen. Ein Ausdruck, bei dem $1 als Operand vorkommt, ist nicht erlaubt.

Zum Glück gibt es eine flexible Alternative. Diese besteht darin, die statische Replace-Methode der Regex-Klasse zu verwenden beim Aufruf einen MatchEvaluator zu übergeben, der bei der PowerShell lediglich aus einem ScriptBlock besteht, dem der Match als Parameterwert übergeben wird:

$t = "%temp%\Test1234.dat" $m = "%(\w+)%" $MatchEval = { param($match) [Environment]::GetEnvironmentVariable($match.groups[1].value) } [Regex]::Replace($t, $m, $MatchEval)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.