64903

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
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 87933

Url: https://administrator.de/forum/batch-textdatei-auslesen-datensaetze-weglassen-87933.html

Ausgedruckt am: 07.05.2025 um 06:05 Uhr

60730
60730 19.05.2008 um 11:32:13 Uhr
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
64903
64903 19.05.2008 um 12:13:44 Uhr
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
bastla
bastla 19.05.2008 um 14:31:32 Uhr
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
64903
64903 19.05.2008 um 16:15:13 Uhr
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