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

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

Printed on: April 20, 2024 at 09:04 o'clock

Member: NordicMike
Solution NordicMike Apr 01, 2020 at 12:19:56 (UTC)
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.
Member: TK1987
Solution TK1987 Apr 01, 2020 updated at 12:30:58 (UTC)
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
Member: NogNog
NogNog Apr 02, 2020 at 07:17:35 (UTC)
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."
Member: TK1987
TK1987 Apr 02, 2020 updated at 10:12:30 (UTC)
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