obacht
Goto Top

Datei auslesen mit wert aus einer liste vergleichen und wegschreiben

Hallo zusammen,
ich versuche zeilenweise aus eine Datei die im Zugriff durch eine DB ist den letzten Eintag auszulesen und mit den Werten in suche-1 zu vergleichen, bei übereinstimmung die ganze Zeile in eine Datei zuschreiben. Sollte ich nicht lieber mit dem diesen Befehl bei einer geöffnet Datei arebiten , wenn die Datei bereits im Zugriff ist?

OpenAsTextStream([IOMode As IOMode = ForReading], [Format As Tristate = TristateFalse]) As Textstream

Grüße

# Start-FileSystemWatcher der Powershell 
import-module FileSystem
get-help Start-FileSystemWatcher 

set suche-1= (importfile; exportfile; DB02; error;)

# String durchsuchen
$Pattern="suche1"  
$LineCounter=0
$NumberOfLines=$(get-content -path "D:\db02.log").count  

Get-Content -path "D:\db02.log" -Wait | ForEach{  
 $LineCounter+=1
 If(($_ -match $Pattern) -and ($Linecounter -gt $NumberOfLines)){
 
Set-Content "d:\tag_meldungen.txt" -Value "$_"   
 # in Datei schreiben
  }
}

[Edit Biber] Codeformatierung [/Edit]

Content-Key: 182189

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

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

Member: 5t8d1e
5t8d1e Mar 20, 2012 at 11:01:32 (UTC)
Goto Top
Hallo,

also wenn ich es richtig verstanden habe suchst du ungefähr sowas:
$pattern = "suche1"  
get-content -wait D:\db02.log | where { $_ -match $pattern } | out-file -append d:\tag_meldungen.txt

wie immer bei mir quick and dirty

grüße
Torsten
Member: obacht
obacht Mar 20, 2012 at 20:29:27 (UTC)
Goto Top
Hallo Thorsten,
diese Lösung ist besser als das was ich bisher habe, meine Lösung ist drei mal so lang face-smile werde mich an deiner Lösung orientieren.

Ich hänge aber gerader an einer anderen Stelle und zwar möchte ich den String in eine dynamisches Array einlesen und das 3 Arrayfeld (3 Absatz in der Zeile) mit einer Fehlerliste vergleichen.
In etwas so:

$pattern = "C:/Liste.txt" # Eine Liste mit diversen Fehlercodes und evenID siehe Beispiel unten
$Event_ID=" "
$Event_ID=" "

get-content -wait D:\db02.log | where { $_ -match $pattern } While ($StreamReader.Endofstream -eq $False){
$Line=$StreamReader.ReadLine( Write-Eventlog -logname 'DB02' -source 'work' -eventID $Event_ID -EntryType $_EntryType -message "$Line" )
}

Der Eintrag soll dann im Eventlog DB02 unter Windows zu finden sein.. leider schaffe ich es nicht den String richtig zu erzeugen / übergeben um im Array das 3 Feld mit der Liste vergleichen zu können. Was mach ich falsch?

Beispiel für die Fehlercode Liste in C./Liste.txt die je Treffer in die Variablen geschrieben werden ($Event_ID=" "; $Event_ID=" ")
ERRORCODE EventID EntryType
1. aeg45244S; 1252; error
2. jhhff56616L; 1000; warning
3. 456sgsv55K 2011 error
usw.
Member: 5t8d1e
5t8d1e Mar 21, 2012 at 09:38:48 (UTC)
Goto Top
ahoi,

Leider komme ich nicht mit deiner Erklärung nicht ganz klar. am besten schickst du mal 3-4 zeilen aus deinen logfile und 3-4 zeilen aus deiner Fehlercodeliste.
Und damit ich weiss wie das Ergebnis aussehen auch hier 1-2 Beispiele. Danach schauen wir mal was daraus gebastelt werden kann.

der Torsten ohne 'h' face-wink
Member: obacht
obacht Mar 21, 2012 at 14:21:51 (UTC)
Goto Top
Ziel ist es das Log DB02.log in Echtzeit zu überwachen:

DB02.log Logdatei sieht so aus:
z.B.

22/03/2012 11:00:18 00255B313I Server is up
22/03/2012 11:00:18 045688G52I Object loaded.
23/03/2012 11:10:22 001CM027E Error. Cluster NGZ04
23/03/2012 11:42:22 0055TS528E Authentication failure from Printstation: 192.168.110.1
(Fehlercode)

Jeder Logeintrag der in das DB02.log geschrieben wird soll sofort auf Fehlercode, welcher in der Fehlematrix hinterlegt ist geprüft werden.


Fehlermatrix:

Fehlercode; EventID; Aktion (bei 1 wir ins Eventlog geschrieben bei 0 wird kein Eintrag geschrieben und der String verworfen.)

00255B313I; 0; 0
021CD02PW; 0; 0
001CM027E ; 9993; 1

Bei 1 wir ins Eventlog geschrieben bei 0 wird kein Eintrag geschrieben und der String verworfen.)

Kommt der Fehlercode in der Fehlermatrix vor und ist mit der 1 im dritten Feld gekennzeichnet, nur dann schreibe einen Eintrag in das Applikation-Eventlog von Microsoft Server.

Der Logeintrag soll die EvntID aus der Fehlermatrix enthalten und als Message den gesamten String (z. B. - 23/03/2012 11:10:22 001CM027E Error. Cluster NGZ04) enthalten.

Falls du noch weiter Informationen brauchst bitte melden.
Viele Grüße
Member: 5t8d1e
5t8d1e Mar 23, 2012 at 07:55:36 (UTC)
Goto Top
Ahoi obacht,


ich gugge mir das mal am WE an und dann schauen wir mal was bei rum.

Ansonsten Happy WE

der Torsten
Member: 5t8d1e
5t8d1e Mar 24, 2012 at 17:11:47 (UTC)
Goto Top
Ich bins wieder!

so das hier sollte funkitionieren
den Debugbereich kannst auskommentieren und das Script direkt mit den Parametern aufrufen

Bsp.: .\get-db2errors.ps1 -Fehlerliste .\known-errors.csv -DB2log .\db2.log -outfile .\errors.log

Param (
[string]$Fehlerliste,
[string]$DB2log,
[string]$outfile
)

###Debug###
[string]$Fehlerliste = "E:\tmp\get-DB2Errors\known-errors.csv"  
[string]$DB2log = "E:\tmp\get-DB2Errors\db2.log"  
[string]$outfile = "E:\tmp\get-DB2Errors\errors.log"  
###########

#import Fehlerliste
[array]$knownErrors = Import-Csv $Fehlerliste -Delimiter ";"  

Get-Content $db2log -wait | Foreach { 
    $DB2Logerror = ($_.split(' '))[2]  
    #$DB2Logerror
    $mymatch = $knownErrors -match $DB2Logerror | select Aktion
    if ($mymatch.Aktion -eq 1) { $_ | Out-File -FilePath $outfile -Append}
}

und nun ab ins WE
der Torsten

ps.: die csv sollte wie folgt aussehen
Fehlercode;EventID;Aktion
00255B313I;0;0
021CD02PW;0;0
001CM027E;9993;1
Member: obacht
obacht Mar 30, 2012 at 10:23:21 (UTC)
Goto Top
Hallo Torsten,
ich konnte mich leider nicht früher melden, die Lösung hat mir sehr geholfen, Danke.

Aktuell kämpfe ich mit folgender Fehlermeldung in der PS:

Write-EventLog : Cannot bind parameter 'EntryType'. Cannot convert value "C" to type "System.Diagnostics.EventLogEntryT
ype". Error: "Invalid cast from 'System.Char' to 'System.Diagnostics.EventLogEntryType'."


Meine Fehlermatrix.csv sieht so aus:
Fehlercode;EventID;EntryType;Aktion
VEP0501CE;VEP0501CE;Warning;1

Ich wollte den Fehlercode im Eventlog als EventID angeben.

welche Art von Platzhalter brauche ich bei dem Befehl Write-EventLog ?

Viele Grüße