h41msh1c0r
Goto Top

Powershell RegEx geht beim match aber beim replace nicht

Servus,

das RegEx für die Logsnamen funktioniert schonmal.

$AlterWert = Get-NIVar "InstallationParameters.Wert1"  
$NeuerWert = '/p="************"'  

$Pfad = "D:\Temp"  

$result = Get-ChildItem | Where-Object { $_.Name -match '^NI[A-Z]{1,3}32_[0-9]{1,3}\.log$' }  

foreach ($file in $result)
{
    (Get-Content $file.PSPath) |
    Foreach-Object { $_ -replace "$AlterWert", "$NeuerWert"} |  
    Set-Content $file.PSPath
}

Jetzt habe ich nach dem gleichen Muster versucht mir einen RegEx zusammenzubauen um $AlterWert zu ersetzen.

Ich könnte das wie oben über Get-NIVar in das PS Script schiessen mag ich aber nicht so.

Wenn ich nun mir mein RegEx hernehme: ^[a-zA-Z]{1,10}![0-9]$

Deckt er im Grunde den zu findenden String sauber ab. Getestet mit https://regex101.com/. Ergebnis --> geht

Nur das geht irgendwie nicht:
    Foreach-Object { $_ -replace "^[a-zA-Z]{1,10}![0-9]$", "$NeuerWert"} |  

Hat einer eine Idee?

VG

Content-Key: 348347

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

Printed on: April 19, 2024 at 15:04 o'clock

Mitglied: 133883
Solution 133883 Sep 06, 2017 updated at 13:26:32 (UTC)
Goto Top
"$NeuerWert"
Im Replace-Pattern werden Dollarzeichen in Strings als Positionsparameter für Regex-Submatches interpretiert, lass die Anführungszeichen weg.
Member: H41mSh1C0R
H41mSh1C0R Sep 06, 2017 at 13:43:56 (UTC)
Goto Top
Das Weglassen der " vorn wirft einen Fehler

 Foreach-Object { $_ -replace ^[a-zA-Z]{1,10}![0-9]$, "$NeuerWert"} |  .......  

das Weglassen hinten wirft keinen Fehler
 Foreach-Object { $_ -replace "^[a-zA-Z]{1,10}![0-9]$", $NeuerWert} |  .......  

allerdings tauscht er mir die Strings dennoch nicht aus.

Zu den Positionsparametern in RegEx, das $ ist doch der Marker für das Ende des RegEx oder muss ich den irgendwie escapen beim -replace?
Mitglied: 133883
Solution 133883 Sep 06, 2017 updated at 13:47:49 (UTC)
Goto Top
Zitat von @H41mSh1C0R:

Das Weglassen der " vorn wirft einen Fehler
Ist ja auch Blödsinn sie vorne weg zu lassen ...
das Weglassen hinten wirft keinen Fehler
Habe ich ja oben deutlich gemacht das die hinteren gemeint waren.
allerdings tauscht er mir die Strings dennoch nicht aus.
Wir kennen den Inhalt des Strings $Alterstring nicht! face-confused
Zu den Positionsparametern in RegEx, das $ ist doch der Marker für das Ende des RegEx
Ja und ^ ist der Anfang des Strings, bei dir muss also alles von Anfang bis Ende matchen!
oder muss ich den irgendwie escapen beim -replace?
Nein im Match part natürlich nicht.
Member: H41mSh1C0R
H41mSh1C0R Sep 06, 2017 updated at 13:50:15 (UTC)
Goto Top
Er machts ^^.

Das ^ und das $ im RegEx weglassen und er machts. =)

THX

Ergebnis:
$AlterWert = Get-NIVar "InstallationParameters.Wert1"  
$NeuerWert = "************"  
$Pfad = "D:\Temp"  
$result = Get-ChildItem | Where-Object { $_.Name -match '^NI[A-Z]{1,3}32_[0-9]{1,3}\.log$' }  
foreach ($file in $result)
{
    (Get-Content $file.PSPath) |
    Foreach-Object { $_ -replace '[a-zA-Z]{1,10}![0-9]', $NeuerWert} |  
    Set-Content $file.PSPath
}