internet2107
Goto Top

Powershell -replace

Guten Morgen zusammen.

Ich habe eine Datei, aus der Werte ausgelesen werden und in einer Variable gespeichert werden.
Um die Werte nicht direkt in der Datei ändern zu müssen, möchte ich das mit Textboxen machen. Alles klappt soweit, nur leider wird in der Textdatei selbst der Wert nicht ersetzt, die Frage ist warum ?.

$path = "E:\Temp\settings_test.ini"  
Get-Content $path | ForEach-Object -Begin { $settingsmenu = @{ } } -Process { $store = [regex]::split($_, '='); if (($store.CompareTo("") -ne 0) -and ($store.StartsWith("[") -ne $True) -and ($store[0].StartsWith("#") -ne $True)) { $settingsmenu.Add($store, $store[1]) } }  
$param100 = $settingsmenu.Get_Item("Param100")  

$FormEvent_Load = {
	
	$pfad_alt.Text = $param100
	
}

$buttonSpeichern_Click = {
	$param100_neu = $pfad_neu.Text
	
	Write-Host $param100
	Write-Host $param100_neu
	
	(get-content $path) | foreach-object { $_ -replace $param100, $param100_neu } | set-content $path
}

Wie man im Code sehen kann, wird beim Start der Wert vom "param100" eingelesen und in der Textbox auch angezeigt.
In der nächsten Textbox soll man die Möglichkeit haben, den Wert zu ändern und mit dem Button "Speichern" wieder zurück in die Textdatei zu schreiben, in dem Fall also der Wert "param100_neu"
Mich wundert, dass er per "Write-Host" die richtigen Werte anzeigt, also alles versteht, aber in der Textdatei selbst den Wert nicht ändert.

Content-ID: 247021

Url: https://administrator.de/forum/powershell-replace-247021.html

Ausgedruckt am: 06.04.2025 um 21:04 Uhr

AnkhMorpork
AnkhMorpork 21.08.2014 um 07:34:13 Uhr
Goto Top
Hallo,

wenn ich das richtig im Sinn habe, löscht du den Wert mit Write-Host. Gibs mal einfach mit "..." aus.

Gruß

ANKH
colinardo
colinardo 21.08.2014 aktualisiert um 08:57:06 Uhr
Goto Top
Moin zusammen,
-replace interpretiert im Eingabestring spezielle Zeichen als Regular Expressions, und da dein Pfad sicherlich Backslashes enthält wird er den alten Pfad in der Textdatei nicht finden, da in Regex ein Backslash gefolgt von Buchstaben eine spezielle Bedeutung hat. Mach es mit der normalen Replace Methode:
(get-content $path | Out-String).replace($param100, $param100_neu) | set-content $path 
Grüße Uwe
internet2107
internet2107 21.08.2014 um 09:22:28 Uhr
Goto Top
Danke Uwe,

an den Backslash habe ich nicht gedacht, stimmt, danke.
Zumindest ändert er nun entspreched, aber leider auch zuviel des Guten face-sad
In der settings_test.ini sind als Beispiel mehrere (4 Stück) dieser "param".

Nach der Änderung hat er nun aber leider auch die Pfade der anderen "Param" geändert.
Es war also für "param100" ein Pfad, wie: "d:\daten\ablage", genauso wie für die "param80...82".
Nur das sich alle entsprechend mit Unterordnern unterscheiden. Er soll aber ja nur den Wert (Pfad) für "param100" ändern
colinardo
Lösung colinardo 21.08.2014 aktualisiert um 10:04:33 Uhr
Goto Top
für deinen ganzen Wust an Code reicht das hier ...
$path = "E:\Temp\settings_test.ini"   
(gc $path) | %{$_ -replace '^(Param100=)(.*)',('$1'+$pfad_neu.Text)} | set-content $path  
Grüße Uwe
internet2107
internet2107 21.08.2014 um 10:05:00 Uhr
Goto Top
That's all. Danke dir... face-smile