nognog
Goto Top

Powershell: Zeilennummer einer Textdatei auslesen

Guten Tag Zusammen


Ich habe eine Frage bezüglich Zeilennummern in Textdateien.
Ich habe ein Logfile bei dem steht, ob ein Produkt aktiviert ist.
Da dieses Script jeden Monat ausgeführt wird, kann es vorkommen, dass im gleichen Logfile steht (Auf Datum achten):
"
19.02.2020 16:16:04; The product is already activated.
19.03.2020 16:16:04; Error
"
Nun möchte ich mit einem Script dieses Logfile durchsuchen, ob das Produkt aktiv ist. Jedoch kann ich nicht einfach nach dem String "The product is already activated" suchen, da es unten im File vielleicht einen Error gab oder umgekehrt.

Wie kann man nun herausfinden ob es nicht mehr aktiviert ist oder doch aktiviert? Kann man die Zeilennummer eines Textfiles herauslesen, damit ich die Zeilennummern vergleichen kann?


Schon mal ein Danke für die Hilfe.

Grüss

NogNog

Content-ID: 562352

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

Ausgedruckt am: 20.11.2024 um 02:11 Uhr

NordicMike
Lösung NordicMike 01.04.2020 um 14:19:56 Uhr
Goto Top
Das Textfile wird keine Zeilennummern haben, zumindest nicht in Deinem Beispiel. Du kannst nach Datum sortieren. Oder, wenn Du Dich darauf verlassen kannst, dass der letzte Eintrag immer unten ist, einfach den letzten Eintrag auslesen und die anderen ignorieren.
TK1987
Lösung TK1987 01.04.2020 aktualisiert um 14:30:58 Uhr
Goto Top
Moin,

Zitat von @NogNog:
Wie kann man nun herausfinden ob es nicht mehr aktiviert ist oder doch aktiviert?
select-string -Path 'C:\Pfad\zum\Logfile.log' -Pattern 'Error$|The product is already activated.$' | sort -Property LineNumber | select -Last 1  
Es wird nach Error und nach The product is already activated. am Zeilenende gesucht, die Ergebnisse werden dann nach Zeilennummer sortiert und der letzte Fund wird ausgegeben.

Gruß Thomas
NogNog
NogNog 02.04.2020 um 09:17:35 Uhr
Goto Top
Danke viel Mal für die Hilfe. Ich hätte noch eine Frage. Wie kann ich nun in einem "if" schauen ob es "Error" oder "Product is already activated." ist?

Beispiel:
$state1 = select-string -Path 'C:\Pfad\zum\Logfile.log' -Pattern 'Error$|The product is already activated.$' | sort -Property LineNumber | select -Last 1

if($state1 -eq "The product is already activated."){
$result1 = "Produkt ist aktiviert." | out-file -FilePath $logfile
}
else{
$result2 = "Produkt ist nicht aktiviert." | out-file -FilePath $logfile
}


Das Problem ist, dass die Ausgabe vom $state1 nicht nur "Error" oder "The product is already activated." ist. Die Ausgabe wäre zum Beispiel: "19.02.2020 16:16:04; The product is already activated."
TK1987
TK1987 02.04.2020 aktualisiert um 12:12:30 Uhr
Goto Top
Moin,

Zitat von @NogNog:
Wie kann ich nun in einem "if" schauen ob es "Error" oder "Product is already activated." ist?

Das Problem ist, dass die Ausgabe vom $state1 nicht nur "Error" oder "The product is already activated." ist. Die Ausgabe wäre zum Beispiel: "19.02.2020 16:16:04; The product is already activated."
Dafür gibt es verschiedene Möglichkeiten, abhängig von dem was man gerade benötigt.

Wenn du wie in diesem Fall weisst, das immer die selbe Anzahl an Zeichen vor der Zeichenkette die du benötigst stehen, bietet sich z. B. Substring an
$state1.Line.Substring(20) # Gibt die Zeichenbkette ab dem 21. Zeichen aus
Eine weitere Möglichkeit, wäre zum beispiel, die Zeichenkette bei dem Semikolon zu trennen; und nur den 2. Teil (also index 1) auszugeben
$state1.Line.split(';')[1]  

Eine 3. Möglichkeit, ist mit Replace und Regex zu arbeiten.
$state1.Line -replace '.*(The Product|Error)','$1'  

Ps: Bitte Code-Tags für das Posten von Code nutzen.

Gruß Thomas