fisistew
Goto Top

Mit Powershell aus .txt bestimmten Wert auslesen und herabsetzen

Hallo zusammen,

ich möchte ein PS Script entwerfen mit dem ich bestimmte Dienste von verschiedenen Servern stoppe, aus einer .txt einen bestimmten Wert auslese und diesen mit einem Wert von -1 dann in einem Array speichere und danach an ein SQL Statement übergebe.
Folgendes habe ich bisher geschafft, bleibe aber am auslesen der .txt hängen.

POWERSHELL
#Service auf dem Server 02 stoppen, 15 Sekunden warten und den Status zurück geben
Set-Service -Name Dienst -ComputerName Server1 -Status Stopped
Start-Sleep -Seconds 15
Get-Service -ComputerName Server1 | Where-Object{$_.Name -like "Dienst"} | %{$_.Status}


#Service auf dem Server 01 stoppen, 15 Sekunden warten und den Status zurück geben
Set-Service -Name Dienst -ComputerName Server2 -Status Stopped
Start-Sleep -Seconds 15
Get-Service -ComputerName Server2 | Where-Object{$_.Name -like "Dienst"} | %{$_.Status}


#Service auf dem Server DB stoppen, 15 Sekunden warten und den Status zurück geben
Set-Service -Name Dienst -ComputerName Server3 -Status Stopped
Start-Sleep -Seconds 15
Get-Service -ComputerName Server3 | Where-Object{$_.Name -like "Dienst"} | %{$_.Status}


#Kopieren der EngineConfiguration.config und als test.txt in TEMP speichern
Copy-Item "C:\Program Files\Pfad\EngineConfiguration.config" C:\temp\test.txt


Bis hierher würde alles funktionieren!
Ich möchte allerdings den Wert auslesen, der hinter dem
deleteHistoricalCalculationsOlderThanDays steht, also die 7 wie in dem Auszug der .txt zu sehen und diesen Wert in ein Array schreiben.

TEXTFILE
<?xml version="1.0" encoding="utf-8"?>

<engineConfiguration>
<executor batchSize="50"
loggingLevel="1"
queueModifiedEachCycle="true"
queueAllPeriodically="true"
queuePeriodicallyAt="4"
queuePeriodicallyWeekDays="Sunday"
requeueFailures="false"
deleteHistoricalCalculationsOlderThanDays="7"
extendValidityPeriods="false"
skipQueuingUnresolved="true"
allowedRemoteIPMask="::1,127.0.0.1,172.16.7.29">


Wie kann ich das realisieren?
Da dieser Wert nicht immer zwingend in der selben Zeile steht oder auch der Wert zwischen 1-31 liegen kann benötige ich etwas Hilfe.

Hat hierzu jemand eine Idee?
Vielen Dank im voraus

Content-ID: 364762

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

Ausgedruckt am: 25.11.2024 um 05:11 Uhr

135333
135333 14.02.2018 aktualisiert um 14:28:31 Uhr
Goto Top
Ich möchte allerdings den Wert auslesen, der hinter dem
deleteHistoricalCalculationsOlderThanDays steht, also die 7 wie in dem Auszug der .txt zu sehen und diesen Wert in ein Array schreiben.
Das ist ein XML File, das lässt sich problemlos via XML Object auslesen
$werte = @()
$werte += ([xml](gc "C:\Program Files\Pfad\EngineConfiguration.config")).engineConfiguration.deleteHistoricalCalculationsOlderThanDays  
Gruß Snap
FISIStew
FISIStew 14.02.2018 um 14:39:14 Uhr
Goto Top
Hey,
erstmal vielen Dank für Deine Antwort!
Allerdings wenn ich den Wert mit write-host $werte ausgeben möchte um zu sehen was er ausgelesen hat, dann hat er nichts ausgelesen face-sad
auch das umleiten in eine Textfile bleibt diese leer!
135333
Lösung 135333 14.02.2018 aktualisiert um 15:27:38 Uhr
Goto Top
Geht hier einwandfrei, leider postest du nicht den kompletten Inhalt der XML Datei, das ist wichtig um den Baum der Eigenschaften zu kennen.
Von mir aus kannst du es auch mit Regular Expressions extrahieren, das geht ebenfalls
$werte  = @()
$werte += [regex]::match((gc "C:\Program Files\Pfad\EngineConfiguration.config" -raw), 'deleteHistoricalCalculationsOlderThanDays="(\d+)"').Groups[1].Value  

p.s. ich gehe hier bei beiden Skripten von einer aktuellen Powershell >= 3.0 aus!
FISIStew
FISIStew 14.02.2018 um 15:37:03 Uhr
Goto Top
Super, damit hat es funktioniert, ich bekomme den Wert 7 zurück!
Vielen Dank erstmal face-smile
FISIStew
FISIStew 15.02.2018 um 08:26:41 Uhr
Goto Top
Eine Frage habe ich noch, falls Du mir da auch helfen kannst face-smile
Wie kann ich nun den Wert den ich ausgelesen habe und mit

$werte -= 1

bearbeitet wurde, nun in die .config Datei zurückschreiben und diese speichern?

VG
135333
Lösung 135333 15.02.2018 aktualisiert um 08:39:49 Uhr
Goto Top
Ich würde dir zwar dringend empfehlen es über die XML Methode zu machen, da du aber anscheinend nicht bereit bist die XML hier im Ganzen zu Posten hier die Replace-Variante.
$path = "C:\Program Files\Pfad\EngineConfiguration.config"  
[regex]::replace((gc $path -raw), 'deleteHistoricalCalculationsOlderThanDays="(\d+)"',{param($m) "deleteHistoricalCalculationsOlderThanDays=`"$([int]$m.Groups[1].Value -1)`""}) | SC $path  
p.s. Wenn du noch eine veraltete PS2.0 nutzt dringend updaten, denn die hat viele Bugs und Unzulänglichkeiten.
FISIStew
FISIStew 15.02.2018 um 08:50:28 Uhr
Goto Top
Guten Morgen,
ich verstehe was Du meinst mit der XML Methode zu lösen, allerdings kann ich Dir aktuell nicht sagen woran es liegt.
Meine PS ist auf dem aktuellsten Stand, allerdings kann ich nur ausschnitte von der XML zeigen, da ich sonst zu viel ändern müsste! Sorry face-sad

Vielen Dank für Deine schnelle Antwort und es würde auch funktionieren, allerdings würde ich gerne den Wert aus der $werte übernehmen und nicht einfach nur -1 , Hintergrund ist, das das Script abbricht wenn der Wert aus der config

if ($werte -le 7)

ist.

VG
135333
135333 15.02.2018 aktualisiert um 09:44:36 Uhr
Goto Top
Zitat von @FISIStew:
Vielen Dank für Deine schnelle Antwort und es würde auch funktionieren, allerdings würde ich gerne den Wert aus der $werte übernehmen und nicht einfach nur -1
Das macht das Skript aber, der Wert wird der XML direkt entnommen und sofort um eins reduziert face-wink. If Abfragen kannst du im MatchEvaluator des 3 Parameters von der Replace-Funktion einfügen.
Einfach mal etwas einlesen wäre mal angebracht, dann musst du nicht jeden Furz erfragen.
https://msdn.microsoft.com/de-de/library/ht1sxswy(v=vs.110).aspx
FISIStew
FISIStew 15.02.2018 um 09:44:46 Uhr
Goto Top
Vielen Dank!