64903
Goto Top

Batch - Textdatei auslesen - Datensätze weglassen

Hallo Leute,

ich habe eine Textdatei erzeugt, die alle "Geplanten Tasks" mit folgenden Infos enthält:

HostName: Server1
TaskName: BP_ALL_RESTART
Last Run Time: 04:30:00, 10.04.2008
Last Result: 0
Task To Run: D:\restart_all.bat
Scheduled Task State: Enabled

Nun möchte ich gerne alle "Datensätze" rausfiltern, wo:
1) "Last Result" ungleich 0
2) "Scheduled Task State" gleich Enabled
Das Ergebnis kommt in eine neue Textdatei.

Keine Ahnung, ob das überhaupt mit einer Batchdatei möglich ist, aber vielleicht hat ja
jemand eine Idee.

Gruss
Oliver

Content-Key: 87933

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

Printed on: April 16, 2024 at 07:04 o'clock

Mitglied: 60730
60730 May 19, 2008 at 09:32:13 (UTC)
Goto Top
Servus,

am einfachsten ist es - wenn alle Infos zu einem Task in einer Zeile stehen (per komma getrennt wäre ideal)

Dann reicht ein einfaches
findstr Wert Dateiname
Mitglied: 64903
64903 May 19, 2008 at 10:13:44 (UTC)
Goto Top
Servus,

am einfachsten ist es - wenn alle Infos zu einem Task in einer Zeile stehen (per komma
getrennt wäre ideal)

Ja, genau das ist ja mein Problem. Wenn alles in einer Zeile wäre, hätte ich es mir "find" gemacht.
Leider bekomme ich die Daten nur in der Form.

Gruss
Oliver
Member: bastla
bastla May 19, 2008 at 12:31:32 (UTC)
Goto Top
Hallo Olli1234 und TimoBeil!

Einen "echten" Datensatz daraus zu machen, war auch meine erste Idee. Unter der Annahme, dass jeder Satz mit "HostName:" beginnt (festgelegt in %Header%), könnte der Batch so aussehen:
@echo off & setlocal
set "Liste=D:\Tasks.txt"  
set "Erg=D:\Ergebnis.txt"  

set "Header=HostName:"  
set "Delim=;"  
set Check1=/v /c:"Last Result: 0"  
set Check2=/c:"Scheduled Task State: Enabled"  

if exist "%Erg%" del "%Erg%"  
set Datensatz=
for /f "usebackq delims=" %%i in ("%Liste%") do call :ProcessLine "%%i"  
echo %Datensatz%|findstr %Check1%|findstr %Check2%>nul && call :Ausgabe "%Datensatz%"  
::echo %Datensatz%|findstr %Check1%|findstr %Check2%>nul && >>"%Erg%" echo %Datensatz% 

goto :eof

:ProcessLine
echo %~1|findstr /b /c:"%Header%">nul || goto :Feld  

echo %Datensatz%|findstr %Check1%|findstr %Check2%>nul && call :Ausgabe "%Datensatz%"  
::echo %Datensatz%|findstr %Check1%|findstr %Check2%>nul && >>"%Erg%" echo %Datensatz% 

set "Datensatz=%~1"  
goto :eof

:Feld
set "Datensatz=%Datensatz%;%~1"  
goto :eof

:Ausgabe
for /f "tokens=1-6 delims=%Delim%" %%a in (%1) do (  
    echo %%a
    echo %%b
    echo %%c
    echo %%d
    echo %%e
    echo %%f
    echo\
)>>"%Erg%"   
goto :eof
Für die Ausgabe gibt es zwei Varianten: entweder die gleiche Aufteilung wie in der Ausgangsdatei (Ergebnis: 6 Datenzeilen + von mir eingefügte Leerzeile) oder (derzeit auskommentiert) Ausgabe als Datensatz in einer Zeile, getrennt durch das mit "set Delim=" angegebene Trennzeichen.

Grüße
bastla
Mitglied: 64903
64903 May 19, 2008 at 14:15:13 (UTC)
Goto Top
Hi bastla,

absolut genial!!
Dein Code funktioniert perfekt! Daumen hoch!!

set Check1=/v /c:"Last Result: 0"
set Check2=/c:"Scheduled Task State: Enabled"

Es gab nur eine Kleinigkeit, da zwischen dem "Last Result:" und der "0" einige Leerzeichen sind.
Das hatte ich zwar auch so gepostet, die wurden aber wohl rausgeschnitten face-smile
Bei der 2. Abfrage gab es das gleiche Problemchen.

Die Batch ist jetzt jedenfalls komplett eingebunden und wird nun jeden Morgen durchlaufen!
Benötigt habe ich die erste Variante.
Danke für deine Hilfe!!

Gruss
Oliver