kaufparkangucker
Goto Top

Batch: Durchsuche .txt nach unterschiedlichen Strings - wenn gefunden mache was

Hallo Forengemeinde,

auf der Suche nach einer Lösung für mein Problem bin ich über dieses Forum gestolpert. Ich habe schon einiges zu Batch gelesen, aber da ich das noch nie gemacht habe bin ich daraus nur bedingt schlauer geworden.

Ich benötige eine Batch die eine "möglicheFehler.txt"-Datei einliest in die ich mögliche Fehlermeldunge von Hand zeilenweise eintrage. Anschließend soll die Batch in einer anderen .txt mit dem Namen "Error.log" ständig nach diesen Fehlern suchen. Wenn ein Fehler gefunden wurde benötige ich eine visuelle (z.B. ein DOS-Fenster mit dem Namen des gefundenen Fehlers ) und eine akustische (z.B. ein PC-Beep) Ausgabe.

Etwas ist noch wichtig, wenn ein Fehler gefunden wurde soll die Batch pausieren. Manchmal kommen nämlich ein Haufen Fehler hinter einander und dann wäre der Monitor voller DOS-Fenster und es würde ständig piepen.

Ich bin kein Admin sondern nur Nutzer von Maschinen die per Windows überwacht werden. Diese Maschinen arbeiten voll automatisch - außer es geht eben etwas schief. Da es sehr anstrengend und zeitaufwendig ist ständig auf den Monitor zu schauen und zu warten bis was schief geht wollte ich Fragen ob Ihr mir helfen könnt.

Danke und Gruß

Paul

Content-Key: 281866

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

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

Member: TryAndSolve
TryAndSolve Sep 03, 2015 updated at 07:08:15 (UTC)
Goto Top
- Können auch während das Skript läuft neue Einträge der Datei möglicheFehler.txt hinzugefügt werden?

- Was machst du, nachdem das Skript einen Fehler in Error.log gefunden hat?. Löscht du den Eintrag dann wieder aus der Log raus ? Sonst würde das Skript danach dauernd an dieser Stelle hängenbleiben...
Member: TryAndSolve
TryAndSolve Sep 03, 2015 updated at 08:27:21 (UTC)
Goto Top
Ok, hab jetzt einfach mal ein kleines PowerShell-Skript reingehauen. Die Pfade sind natürlich noch anzupassen.

Wenn du während das Skript läuft, die moeglicheFehler.txt um Einträge erweitern willst, musst du die Zeile
$fehler = Get-Content $fehlerListenPath in die while Schleife verschieben, unter die Zeile
$logInhalt = Get-Content $errorLogPath.

Wenn der Fehler natürlich dann nicht erst aus der .log gelöscht wird, wird dieser immer wieder gefunden.


 
# Assembly fuer MessageBox
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null  

# Variablen
$fehlerListenPath = "C:\..\möglicheFehler.txt"  
$errorLogPath = "C:\..\Error.log"  

# Programm
$fehler = Get-Content $fehlerListenPath

while($true) {
    $logInhalt = Get-Content $errorLogPath

    $fehler | foreach {
        if($logInhalt -match $_) {
            [System.Console]::Beep(1000,600)
            [System.Windows.Forms.MessageBox]::Show("$_" , "Fehler")   
        }
    Start-Sleep -s 3
    }
}
Member: kaufparkangucker
kaufparkangucker Sep 03, 2015 at 07:49:32 (UTC)
Goto Top
Eigentlich werde ich während das Skript läuft keine Fehler hinzufügen.
Hmm, das mit dem wiederholten Finden des gleichen Fehlers habe ich nicht bedacht.
Hier wäre es mir am liebsten der Fehler würde in eine andere Datei "gefundeneFehler.txt" kopiert und anschließend aus der Datei Error.log gelöscht
Member: kaufparkangucker
kaufparkangucker Sep 03, 2015 at 07:51:50 (UTC)
Goto Top
@try: Der Rechner läuft unter Windows 2000 SP4 ohne Internet. Läuft darauf ein Powershell Skript? Ich weiß, das hätte ich auch gleich sagen können, ist mir aber erst jetzt aufgefallen das das eigentlich eine sehr wichtige Info ist.
Member: TryAndSolve
TryAndSolve Sep 03, 2015 updated at 08:34:41 (UTC)
Goto Top
Nein, da läuft es leider nicht drauf face-sad

Leider bin ich eher ein Schönwetter-Skriptschreiber und habe auch gerade erst mit Skriptsprachen / PowerShell richtig angefangen. Tut mir leid.
Mitglied: 114757
114757 Sep 03, 2015 updated at 13:23:32 (UTC)
Goto Top
Moin Paul,
probier mal das
@echo off
set "errorcodes=C:\moeglicheFehler.txt"  
set "errorlog=C:\Error.log"  
set "tmp=%temp%\Error.log"  
set wait=10
:START
del "%tmp%" >nul 2>&1  
for /f "usebackq tokens=* delims=" %%a in ("%errorcodes%") DO @(  
	findstr /ic:"%%a" "%errorlog%">nul && (  
		@echo 
		echo Fehler '%%a' aufgetreten  
		findstr /ivc:"%%a" "%errorlog%">"%tmp%"  
		pause
	)
)
move "%tmp%" "%errorlog%" >nul 2>&1  
cls
echo Warte auf Fehler ...
ping -n %wait% localhost >nul
goto START
Gruß jodel32