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-ID: 182189

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

Ausgedruckt am: 05.11.2024 um 08:11 Uhr

5t8d1e
5t8d1e 20.03.2012 um 12:01:32 Uhr
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
obacht
obacht 20.03.2012 um 21:29:27 Uhr
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.
5t8d1e
5t8d1e 21.03.2012 um 10:38:48 Uhr
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
obacht
obacht 21.03.2012 um 15:21:51 Uhr
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
5t8d1e
5t8d1e 23.03.2012 um 08:55:36 Uhr
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
5t8d1e
5t8d1e 24.03.2012 um 18:11:47 Uhr
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
obacht
obacht 30.03.2012 um 12:23:21 Uhr
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