Wie kann ich Werte in einer XML-Datei mit PowerShell ändern?

1 Antwort

PowerShell-Tutorial IV: XML-Dateien und relationale Datenbanken | iX Magazin (heise.de)

Oder Du schaust dir die C#-XML-APIs an.
Powershell kann das .NET-Framework nutzen, entsprechend hast Du in Powershell die gleichen Möglichkeiten, wie mit C# - nur sehr viel umständlicher.

tm107 
Fragesteller
 15.10.2021, 01:23

Mein bisheriger Versuch lautet:

$path = "Pfad zur XML-Datei"
$xml = [xml](Get-Content -Path $path)
$xml.SelectSingleNode("setting[@name=Dailylimit_Running]/value")
$xml.set_Innertext("0")
$xml.Save($path)

Aber da kommt immer die Fehlermeldung "Der 'InnerText' eines 'Document'-Knotens ist schreibgeschützt und kann nicht festgelegt werden." ...
Und da komme ich nicht weiter ...

0
Palladin007  15.10.2021, 01:26
@tm107

Weil Du das ganze XML änderst und nicht nur den Knoten, den Du suchst.

0
tm107 
Fragesteller
 15.10.2021, 01:42
@Palladin007

Zweiter (erfolgloser) Versuch:

$path = "Pfad zur XML-Datei"
$xml = [xml](Get-Content -Path $path)
$Node = $xml.SelectSingleNode("setting[@name=Dailylimit_Running]/value")
$Node.set_Innertext("0")
$xml.Save($path)

Wie man wohl merkt, ist die PowerShell überhaupt nicht mein Freund :-(

0
tm107 
Fragesteller
 15.10.2021, 16:49
@Palladin007

Die Fehlermeldung lautet:
"Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat." (Zeile 4)
Damit kann ich leider nix anfangen ...

0
tm107 
Fragesteller
 15.10.2021, 18:41
@Palladin007

So ähnlich habe ich mir das auch gedacht ... kann aber nicht herausfinden, warum das so ist :-(

0
Palladin007  15.10.2021, 21:31
@tm107
//setting[@name='Dailylimit_Running']/value

Trial&Error ist bei sowas selten eine gute Idee, Du solltest Doku lesen.

0
tm107 
Fragesteller
 16.10.2021, 00:49
@Palladin007

Vielen Dank!

Irgendwie liegt mir das gesamte Konzept bei der PowerShell nicht so ganz. Selbst das BGB liest sich für mich bald einfacher als die Dokus der PowerShell.
Wenn ich bisher etwas selbst geschrieben habe, dann eher in einfachem C (für ATMega) oder als Batch- bzw. Shell-Skript.
Und während des Studiums noch in Assembler (lange her - habe ich gehasst).

Jetzt sieht mein kleines Skript also so aus:

$path = "Pfad zur XML-Datei"
$xml = [xml](Get-Content -Path $path)
$Node = $xml.SelectSingleNode("//setting[@name='Dailylimit_Running']/value")
$Node.set_Innertext("0")
$Node = $xml.SelectSingleNode("//setting[@name='GoSmall_Running']/value")
$Node.set_Innertext("0")
$Node = $xml.SelectSingleNode("//setting[@name='GoLarge_Running']/value")
$Node.set_Innertext("0")
$xml.Save($path)

... und funktioniert wunderbar.

Danke nochmal!

0