Wie kann ich Werte in einer XML-Datei mit PowerShell ändern?
Hallo, ich möchte in folgender XML-Datei die drei Werte hinter "Dailylimit_Running", "GoSmall_Running" und "GoLarge_Running" mittels PowerShell jeweils auf 0 setzen.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<userSettings>
<R_Go_Break.Properties.Settings>
<setting name="Start_On_Boot" serializeAs="String">
<value>True</value>
</setting>
<setting name="Check_For_Updates" serializeAs="String">
<value>True</value>
</setting>
<setting name="Dailylimit_Running" serializeAs="String">
<value>959</value>
</setting>
<setting name="UpdateSettings" serializeAs="String">
<value>False</value>
</setting>
<setting name="GoSmall_Running" serializeAs="String">
<value>99</value>
</setting>
<setting name="GoLarge_Running" serializeAs="String">
<value>3578</value>
</setting>
<setting name="Restarting" serializeAs="String">
<value>False</value>
</setting>
<setting name="RestartingWindowMode" serializeAs="String">
<value>1</value>
</setting>
</R_Go_Break.Properties.Settings>
</userSettings>
</configuration>
Das Ganze ist ein Auszug aus der config-Datei der R-Go Break App, welche bei mir aus unerfindlichen Gründen die täglichen Arbeitszeitzähler nicht auf null zurücksetzt.
Das würde ich nun gerne mittels PowerShell-Skript manuell erledigen.
Einfach die komplette Datei zu ersetzen ist keine Option, da auch andere Zähler darin gespeichert werden.
Nebenbei bemerkt finde ich es recht mies entwickelt, dass die Zähler dieser App jede Sekunde in der Log-Datei aktualisiert werden. Das hätte man auch ohne sekündliche Schreibzugriffe auf die HDD lösen können.
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.
Weil Du das ganze XML änderst und nicht nur den Knoten, den Du suchst.
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 :-(
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 ...
So ähnlich habe ich mir das auch gedacht ... kann aber nicht herausfinden, warum das so ist :-(
//setting[@name='Dailylimit_Running']/value
Trial&Error ist bei sowas selten eine gute Idee, Du solltest Doku lesen.
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!
Mein bisheriger Versuch lautet:
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 ...