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

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

Printed on: April 19, 2024 at 19:04 o'clock

Mitglied: 135333
135333 Feb 14, 2018 updated at 13:28:31 (UTC)
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
Member: FISIStew
FISIStew Feb 14, 2018 at 13:39:14 (UTC)
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!
Mitglied: 135333
Solution 135333 Feb 14, 2018 updated at 14:27:38 (UTC)
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!
Member: FISIStew
FISIStew Feb 14, 2018 at 14:37:03 (UTC)
Goto Top
Super, damit hat es funktioniert, ich bekomme den Wert 7 zurück!
Vielen Dank erstmal face-smile
Member: FISIStew
FISIStew Feb 15, 2018 at 07:26:41 (UTC)
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
Mitglied: 135333
Solution 135333 Feb 15, 2018 updated at 07:39:49 (UTC)
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.
Member: FISIStew
FISIStew Feb 15, 2018 at 07:50:28 (UTC)
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
Mitglied: 135333
135333 Feb 15, 2018 updated at 08:44:36 (UTC)
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
Member: FISIStew
FISIStew Feb 15, 2018 at 08:44:46 (UTC)
Goto Top
Vielen Dank!