ceerotolerance
Goto Top

findstr mehrmals auf Ausgabe eines make anwenden

Hallo Zusammen
Ich bin schon länger dabei, habe aber bisher noch nicht sehr aktiv mitgemacht.
Nun habe ich eine Frage zum batchen. Ich hoffe es kann jemand weiter helfen. Danke schonmal.

Für einen Microcontroller habe ich eine Batch Datei, die mir den Ablauf des Compilieren, linken usw. abnimmt.
Ich möchte nun nach dem make schauen, ob es irgendwelche Fehler gegeben hat. Die Ausgabe des make sieht in etwa so aus:

PolyMake V3.3 for MSDOS
Copyright 1984-1990 Sage Software, Inc.  All rights reserved.
Today's date is 27 Jul 2009  9:17:16.  
a166 start167.a66 SET (HLARGE) M167

A166 MACRO ASSEMBLER V4.20 - SN: C6D4U-70025E
COPYRIGHT KEIL ELEKTRONIK GmbH 1991 - 2001

ASSEMBLY COMPLETE.  0 WARNING(S), 0 ERROR(S)

c166 kyoMAIN.c HLARGE WL(2) OT(6,SPEED)

C166 COMPILER V4.20c - SN: C6D4U-70025E
COPYRIGHT KEIL ELEKTRONIK GmbH 1991 - 2001

C166 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)
c166 Flash.c HLARGE WL(2) OT(6,SPEED)

C166 COMPILER V4.20c - SN: C6D4U-70025E
COPYRIGHT KEIL ELEKTRONIK GmbH 1991 - 2001

C166 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)
make complete.

Wichtig sind immer die Zeilen mit "...COMPLETE. X WARNING(S), Y ERROR(S)".
Ich hab es hingekriegt, dass ich die Warnings und Errors auslesen kann, jedoch überspringt es die Zeile "ASSEMBLY COMPLETE". Warum weiss ich nicht.

Wenn das ganze für euch zu einfach ist, wäre es schön, wenn man noch den Dateinamen z.B. "kyoMAIN.c" oder "Flash.c" ausgeben könnte, falls ein Fehler auftrat.

Content-Key: 121378

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

Printed on: April 20, 2024 at 03:04 o'clock

Member: rubberman
rubberman Jul 27, 2009 at 08:28:26 (UTC)
Goto Top
Hallo ceerotolerance,

da du deinen Code nicht gepostet hast, vermute ich, du liest das ganze in einer FOR-Schleife aus.
Bei Zeilen mit C166 stehen die Werte im 4. bzw 6. Token, sonst im 3. bzw 5.
Könnte die Ursache sein?!
Member: ceerotolerance
ceerotolerance Jul 27, 2009 at 08:29:40 (UTC)
Goto Top
Danke für die schnelle Antwort. Den Code habe ich noch nihct gepostet, weil ich noch bisschen daran rumfeile... kommt noch.
Member: ceerotolerance
ceerotolerance Jul 27, 2009 at 09:16:45 (UTC)
Goto Top
@echo off & setlocal 

for /f "delims=: tokens=1*" %%i in ('findstr /n /l /c:"COMPLETE." "onlymake.log"') do (set Zeile=%%i  & set line=%%j & call :Proc)  

:Proc
if not defined Zeile echo MAKE FAILED! & goto EOF 
set /a Zeile-=1

for /f "tokens=1-7" %%a in ("%line%") do (  
set a=%%a
set b=%%b
set c=%%c
set d=%%d
set e=%%e
set f=%%f

::debug
echo Word 1: %%a
echo Word 2: %%b
echo Word 3: %%c
echo Word 4: %%d
echo Word 5: %%e
echo Word 6: %%f
)
pause

:ERRHANDLER
:: display current file!?

if "%a%"== "C166" (  
	echo TRUETRUETRUE
	set Err=%f%
	set Warn=%c%
) else (
	set Err=%e%
	set Warn=%c%
)

echo Warnings: %Warn%
echo Errors  : %Err% 

Dieser Code funktioniert schon mal nicht schlecht. Es gibt aber ein Problem wenn die Zeile mit C166 anfängt. Den Fall habe ich mit einem if abgefangen, jedoch habe ich in der Variable %Warn% immer "COMPLETE." anstatt den nachfolgenden Zahlenwert. Kann mir das einer erklären? Denn in der Ausgabe (debug) scheint es zu stimmen.
Member: ceerotolerance
ceerotolerance Jul 27, 2009 at 09:25:12 (UTC)
Goto Top
OK sorry für den POST vorhin...

habe die If Abfrage folgendermassen verändert:
if "!a!"=="C166" (  
	echo TRUETRUETRUE
	set Err=!f!
	set Warn=!d!
) else (
	set Err=!e!
	set Warn=!c!
)
sonst bringt ja das enabledelayedexpansion nichts...
Member: rubberman
rubberman Jul 27, 2009 at 09:44:15 (UTC)
Goto Top
Ohne, dass ich das schon genauer getestet habe, ist mir eine Sache sofort ins Auge gesprungen:
Du hast einen Doppelpunkt als Delimiter gesetzt - in den relevanten Zeilen kommt kein Doppelpunkt vor!

EDIT: Sorry - Option /n übersehen
Member: rubberman
rubberman Jul 27, 2009 at 10:07:24 (UTC)
Goto Top
Ungetestet!
probier mal
@echo off &setlocal

for /f "delims=. tokens=1,*" %%i in ('findstr /c:"COMPLETE." "onlymake.log"') do (  
 for /f "tokens=1-3" %%k in ("%%j") do set /a Warn=%%k &set /a Err=%%m &call :Proc  
)
pause
goto :eof

:Proc

:: display current file!?

echo Warnings: %Warn%
echo Errors  : %Err%
Edit: Pause dazu, damit man was sieht face-wink
Member: miniversum
miniversum Jul 27, 2009 at 11:08:05 (UTC)
Goto Top
Versuch mal das:
@echo off & setlocal  
for /f "tokens=1,3,5 delims=:." %%l in ('findstr /n /c:"COMPLETE." "onlymake.log"') do call :doit %%l %%m %%n  
goto:eof

:doit
set /a Zeile=%1-6
set "filename="  
for /f "skip=%Zeile% tokens=2 delims= " %%i in ('findstr /n /r .* "onlymake.log"') do if not defined filename set filename=%%i  
echo %filename%:
echo Warnings: %2
echo Errors      : %3
echo.
goto:eof

::edit: Ausgabe bearbeitet
Member: ceerotolerance
ceerotolerance Jul 28, 2009 at 07:09:52 (UTC)
Goto Top
Danke euch beiden für eure Beispiele.
@rubberman: Deins habe ich ausprobiert. Leider geht es einmal zuviel durch die äussere Schlaufe. Die Ursache habe ich noch nicht gefunden.
@miniversum: Deins verstehe ich noch nicht ganz. Ich werde es mir zu Gemüte führen, wenn ich einmal bisschen mehr Zeit habe.

Gruss cee
Member: ceerotolerance
ceerotolerance Jul 28, 2009 at 07:17:48 (UTC)
Goto Top
@rubberman: Ach mannomann, hatte keine Sprungmarke drin... dein Code funktioniert einwandfrei.
Member: ceerotolerance
ceerotolerance Jul 28, 2009 at 08:11:24 (UTC)
Goto Top
@miniversum: Deine Lösung gefällt mir auch. Vorallem das mit dem Filename. Ich musste es noch bisschen abändern damit es auch tatsächlich die Anzahl der Warnings und Errors anzeigt.
@echo off & setlocal
for /f "tokens=1,3,5,6 delims=:." %%l in ('findstr /n /c:"COMPLETE." "onlymake.log"') do call :doit %%l %%m %%n %%o  
goto :eof 

:doit 

set /a Zeile=%1-6 
set "filename="   
for /f "skip=%Zeile% tokens=2 delims= " %%i in ('findstr /n /r .* "onlymake.log"') do if not defined filename set filename=%%i   
echo %filename%
echo ----------------
echo Warnings: %2
echo Errors:   %4
echo. 
pause
goto:eof