noleva
Goto Top

Powershell Replace in mehreren Zeilen

Hallo Community,

ich stell mich gerade etwas blöd an wahrscheinlich, aber ich finde aufs verrecken den Fehler in meinem Code nicht.

Kurz und knapp:

ich möchte einfach nur Zeilen in einer Datei mit einen anderen Text füllen.
Es betrifft genau genommen drei Zeilen die geändert werden sollen.
Wenn ich meinen Befehl ausführe ändert er mir irgendwie nichts. Zeile für Zeile einzeln, kein Problem.

Ich bin nicht so sehr bewandert in Powershell, aber an und für sich sollte doch hieran nicht so viel Falsch sein oder?
Die # muss auch weg, da die in dem File auskommentiert.
Die Zeile 9 könnte man bestimmt auch anders lösen, aber so fand ich es für mich selber einfacher und einheitlicher face-smile

#Pfad zu idea.properties
$path = 'C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2019.1.1\bin\idea.properties'  
#Datei einlesen
$input = Get-content $path

#Inhalt ändern
$input.Replace('# idea.config.path=${user.home}/.PyCharmCE/config', 'idea.config.path=C:/PycharmC/config') | Set-Content $path  
$input.Replace('# idea.system.path=${user.home}/.PyCharmCE/system', 'idea.system.path=C:/PycharmC/system') | Set-Content $path  
$input.Replace('# idea.plugins.path=`${idea.config.path}/plugins', 'idea.plugins.path=${idea.config.path}/plugins') | Set-Content $path  

Ich habe es auch mit ; am Ende jeder Zeile versucht, mit " anstatt von ' und die einzelnen Sonderzeichen # und $ mit ' maskiert. Alles irgendwie ohne Erfolg.
Komischerweise wird je nach meiner "Variation" nur die Zeile 7 und 9 durchgeführt und 8 nicht.

Alles etwas Strange aber ich denke die Lösung ist sicherlich sehr einfach, ich komme nur nicht drauf.

Sieht da jemand den Fehler und kann mir kurz aushelfen? face-smile

Vielen Dank für Eure Hilfe!

Gruß,
Fabian

Content-ID: 583970

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

Ausgedruckt am: 13.11.2024 um 00:11 Uhr

Doskias
Lösung Doskias 02.07.2020 aktualisiert um 12:51:44 Uhr
Goto Top
Moin Fabian,

ich habe mir das mal angeschaut und nachgebaut. Mein "Problem" dabei war/ist, dass lediglich die letzte Zeile verändert wird. Nach etwas Analyse war es mit klar. Schau dir mal an was du machst:

Du liest in Zeile 4
Du änderst etwas in Zeile 7 und schreibst es in die Datei
Du änderst erneut was in Zeile 8 und schreibst die Änderung in die Datei

Dein Haken abei: Du liest nicht erneut ein. Wenn Zeile 7 und 8 etwas geändert werden muss, dann überschreibst du dir die Änderung aus Zeile 7. Wenn ich etwas Ändern will, was nicht existiert bekomme ich eine Method not Found-Exeption.

Mein Vorschlag:
hinter den ersten beiden Replace noch einmal:
$input = Get-Content $path

#Inhalt ändern
$input.Replace('# idea.config.path=${user.home}/.PyCharmCE/config', 'idea.config.path=C:/PycharmC/config') | Set-Content $path  
$input = Get-content $path
$input.Replace('# idea.system.path=${user.home}/.PyCharmCE/system', 'idea.system.path=C:/PycharmC/system') | Set-Content $path  
$input = Get-content $path
$input.Replace('# idea.plugins.path=`${idea.config.path}/plugins', 'idea.plugins.path=${idea.config.path}/plugins') | Set-Content $pathcode>  

Wenn du den Inhalt nicht aktualisierst, dann basieren deine Änderungsbefehle auf dem Ursprungsinhalt deiner Datei.

Bei mir konnte ich damit deinen Fehler nicht mehr reproduzieren. ;)
noleva
noleva 02.07.2020 um 13:28:10 Uhr
Goto Top
Hi,

ja danke für den Tipp.
Sowas habe ich mir schon fast gedacht, aber irgendwie kam die Idee nicht richtig an face-smile

Jetzt gehts!

Gruß
144705
144705 02.07.2020 aktualisiert um 15:49:20 Uhr
Goto Top
Zitat von @Doskias:
Mein Vorschlag:
hinter den ersten beiden Replace noch einmal:
$input = Get-Content $path

Viel zu umständlich und Ressourcenfressend nur einen einzigen Replace zu machen und es dann erneut zurück zu schreiben, das erledigt man in einem Waschgang indem man das Ergebnis einfach einer Variablen zuweist und erst nach allen Replacements die Daten zurück schreibt ...
$input = $input.Replace('# idea.config.path=${user.home}/.PyCharmCE/config', 'idea.config.path=C:/PycharmC/config')  
$input = $input.Replace('# idea.system.path=${user.home}/.PyCharmCE/system', 'idea.system.path=C:/PycharmC/system') | Set-Content $path  
$input | Set-Content $path