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-Key: 247021

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

Printed on: April 25, 2024 at 21:04 o'clock

Member: AnkhMorpork
AnkhMorpork Aug 21, 2014 at 05:34:13 (UTC)
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
Member: colinardo
colinardo Aug 21, 2014 updated at 06:57:06 (UTC)
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
Member: internet2107
internet2107 Aug 21, 2014 at 07:22:28 (UTC)
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
Member: colinardo
Solution colinardo Aug 21, 2014 updated at 08:04:33 (UTC)
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
Member: internet2107
internet2107 Aug 21, 2014 at 08:05:00 (UTC)
Goto Top
That's all. Danke dir... face-smile