Batch-Datei erkennt Zeilennummer in zweiter FOR-Schleife nicht
Liebe Alle,
ich habe eine Batch-Datei erhalten, mit der ich aus einer .txt.-Datei einen Kommentar auslesen möchte. Dieser Kommentar wird immer von den Begriffen "Ergebnisse Systemqualität" und "Fächersummen-Bitmap" umrahmt, d.h. in meinem .txt-File steht so etwas wie:
Nun sollen mithilfe der Batch-Datei diese beiden Ausdrücke gesucht und die zugehörige Zeilennummer ausgegeben werden. Dies erfolgt mit zwei FOR-Schleifen:
Anschließend soll das ganze File Zeile für Zeile ausgelesen und als Array gespeichert werden:
Als nächstes wird mithilfe von lnBeforeComment und lnAfterComment eine "Start- und Endposition" festgelegt, um den Kommentar zwischen diesen beiden Positionen in einer neuen Variable zu speichern:
Das Programm erkennt nun zwar die Zeilennummer, in der "Ergebnisse Systemqualität" steht und übergibt sie wie gewollt an den Parameter lnBeforeComment, leider funktioniert das bei der zweiten FOR-Schleife nicht mehr. Wenn ich mir "lnAfterComment" ausgeben lasse, dann erhalte ich keinen Wert, dementsprechend wird auch "myEnd" nicht definiert.
Ich habe mittlerweile viel ausprobiert, komme aber garnicht weiter. Die Zeilennummern, in denen "Ergebnisse Systemqualität" und "Fächersummen-Bitmap" auftauchen sind oftmals unterschiedlich, da auch die Kommentare unterschiedlich lang sind und sich über mehrere Zeilen erstrecken können.
Könnte mir hierbei evtl jemand helfen? Ich bin auch offen für Optimierungen was den restlichen Code angeht...einiges kann man bestimmt effizienter gestalten.
Vielen Dank schonmal, ich hoffe ich habe alles ausreichend beschrieben!
ich habe eine Batch-Datei erhalten, mit der ich aus einer .txt.-Datei einen Kommentar auslesen möchte. Dieser Kommentar wird immer von den Begriffen "Ergebnisse Systemqualität" und "Fächersummen-Bitmap" umrahmt, d.h. in meinem .txt-File steht so etwas wie:
Ergebnisse Systemqualität
//Kommentar//
//Kommentar//
//Kommentar//
Fächersummen-Bitmap
Nun sollen mithilfe der Batch-Datei diese beiden Ausdrücke gesucht und die zugehörige Zeilennummer ausgegeben werden. Dies erfolgt mit zwei FOR-Schleifen:
for /f "delims=:" %%x in ('findstr /n "Ergebnisse Systemqualität" tempfile.txt') do set lnBeforeComment=%%x
for /f "delims=:" %%x in ('findstr /n "Fächersummen-Bitmap" tempfile.txt') do set lnAfterComment=%%x
Anschließend soll das ganze File Zeile für Zeile ausgelesen und als Array gespeichert werden:
set count=0
for /f "tokens=*" %%b in (tempfile.txt) do (
set /a count+=1
set thisLine[!count!]=%%b
)
set /a myStart=!lnBeforeComment!+1
set /a myEnd=!lnAfterComment!-1
set myComments=x
for /l %%a in (!myStart!,1,!myEnd!) do (
set myComments=!myComments! !thisLine[%%a]!
)
set myComments=!myComments:~2!
Das Programm erkennt nun zwar die Zeilennummer, in der "Ergebnisse Systemqualität" steht und übergibt sie wie gewollt an den Parameter lnBeforeComment, leider funktioniert das bei der zweiten FOR-Schleife nicht mehr. Wenn ich mir "lnAfterComment" ausgeben lasse, dann erhalte ich keinen Wert, dementsprechend wird auch "myEnd" nicht definiert.
Ich habe mittlerweile viel ausprobiert, komme aber garnicht weiter. Die Zeilennummern, in denen "Ergebnisse Systemqualität" und "Fächersummen-Bitmap" auftauchen sind oftmals unterschiedlich, da auch die Kommentare unterschiedlich lang sind und sich über mehrere Zeilen erstrecken können.
Könnte mir hierbei evtl jemand helfen? Ich bin auch offen für Optimierungen was den restlichen Code angeht...einiges kann man bestimmt effizienter gestalten.
Vielen Dank schonmal, ich hoffe ich habe alles ausreichend beschrieben!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 7878861879
Url: https://administrator.de/forum/batch-datei-erkennt-zeilennummer-in-zweiter-for-schleife-nicht-7878861879.html
Ausgedruckt am: 19.03.2025 um 08:03 Uhr
1 Kommentar

Lass den Batch-Unsinn und nimm gleich die PowerShell
https://tio.run/##fU47jgIxFOtzinSTICYjWhoQCCjoQKIBiiw8mIzyGfJeBEgch5twsC ...
Tote sollte man nicht wieder wecken, du kommst in die Hölle 😉.
Wenn du das riskieren willst
Zeppel
[regex]::match((Get-Content "d:\datei.txt" -Raw),'(?ism)Ergebnisse Systemqualität\s*(.*?)Fächersummen-Bitmap').Groups[1].Value.trim()
Tote sollte man nicht wieder wecken, du kommst in die Hölle 😉.
Wenn du das riskieren willst
@echo off &setlocal
chcp 1252 >nul
:: Eingabedatei
set "fileIN=D:\test.txt"
:: Ausgabedatei
set "fileOUT=D:\test_out.txt"
:: Startzeile
for /f "tokens=1 delims=:" %%a in ('findstr /inrc:"Ergebnisse Systemqualit.t" "%fileIN%"') do set /a start=%%a+1
:: Endzeile
for /f "tokens=1 delims=:" %%a in ('findstr /inrc:"F.chersummen-Bitmap" "%fileIN%"') do set /a end=%%a-1
:: gewünschte Zeilen in die Ausgabedatei schreiben
>"%fileOUT%" (for /f "tokens=1* delims=:" %%a in ('findstr /n "^" "%fileIN%"') do if %%a GEQ %start% if %%a LEQ %end% echo.%%b)
Zeppel