Habe gerade in einem DOS-Batchfile, mit verschachtelten CALL-Aufrufen eine Fehlermeldung bekommen und muss jetzt mühsam die entsprechende Quelldatei/Zeile finden, in der dieser Fehler aufgetreten ist.
Dabei kam mir die Idee, dass doch eigentlich die Prompt-Funktion, d.h. der Text, der bei einer DOS-Eingabe als Prefix erscheint mir diese Information liefern könnte. Statt also z.B.
PROMPT $p$g
könnte so etwas wie
PROMPT $%current_batchfile%$%current_batchline%$g
stehen.
Dieser Befehl dient nur zur Verdeutlichung, was ich eigentlich will. Dass dies genau so natürlich nicht funktioniert ist klar. Aber vielleicht gibt es eine solche Funktionalität.
Dies wäre super-praktisch, weil man so direkt sehen würde, in welchem File und welcher Zeilennummer eine Fehlermeldung auftaucht.
Viele Grüße.
Mdl
Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge
Hi,
ich habe zwar seit erscheinen von XP batch-programmierung weitgehend aufgegeben,
' habe dabei, zuvor, aber gerne mit pipes gearbeitet
beispiel, für das was ich meine:
- echo.|time|find "00">>test.txt
(falls die batch nicht stoppt nach dem Aufruf des calls, den errorlevel>>zähler in eine tmp-datei schreiben)
vg xaver
Hallo Xaver,
ehrlich gesagt, ich weiß nicht, was Deine Zeile macht. Ich habe sie mal einfach so eingegeben und sie erzeugt eine leere Datei.
Das mit dem Prompt wäre super-praktisch, da es anfangs (nicht einmal in der Quelldatei) definiert werden müsste und dann beim Durchlauf der Batchdatei (sofern echo nicht abgeschaltet) ist automatisch beim Ausführen jeder Zeile deren Position und Zeilennummer ausgeben würde.
Ich denke mal, Dein Vorschlag würde darauf hinauslaufen, dass man diese Zeilen von Hand in jede Zeile einfügt.
Gruß,
Mdl
Hi Mdl,
ehrlich gesagt, ich weiß nicht, was Deine Zeile macht. Ich habe sie mal einfach so eingegeben und sie erzeugt eine leere Datei.
na gut, ich hätte als Beispiel-Suchstring vielleicht nicht gerade "00" angeben sollen :-]
echo.|time|find "00">>test.txt gibt auf dem Screen die Systemzeit aus, durch den Pipe | (=Verkettung) wird die Zeitausgabe aber an Find übergeben, der den 'Zeitstring' auf die Zeichenfolge "00" 'untersucht' (= 00 sek,min,std) und wenn zutreffend in die Datei test.txt schreibt
Wenn Du diese Befehlszeile innerhalb einer Schleife ausführst, bekämest Du folglich eine fortlaufende Zeitausgabe, wenn die Bedingung 00 vorhanden ist.
(Sinnlos, war aber auch nur ein Beispiel!)
------------------------------- schnipp ----------------------------
Meine Idee war, dass Du innerhalb eines calls den errorlevel abfragst, in eine "err.tmp"-Datei schreiben lässt und anschliessend, in der äußeren batch, nach jedem einzelnen call, diese Datei auf einen Fehler-Errorlevel, z.B. in der Form
- type err.tmp|find "%E%" >>Fehler.txt.
("%E%" ist Beispiel für die in der Variablen gespeicherten Wert des errorlevels) testest.
Tritt kein Fehler auf, wird nicht in die Datei geschrieben
Setzt man zusätzlich am Anfang jeder über call aufgerufen "Tochter-batch" eine dafür
charakteristischen Variable über set=... und schreibt sie über ..
- echo "Var" >>err.tmp
- echo.>>err.tmp
erhält man z.B. eine 'Fehler.txt'-Textdatei in der Form:
#1
#2
...
#5
7
#6
#7
1
#8
usw.
Im Beispiel oben, liefert also call #5 und #7 einen errorlevel <> 0 zurück,
wodurch man die fehlerhaften calls identifiziert hätte
Diese Textdatei kann man am Ende der batch per type auf dem Bildschirm ausgeben
oder anschliessend via explorer im Texteditor anschauen.
---
Deine Idee den Prompt für die Ausgabe zu benutzen, ließe sich, vermute ich, auf ähnliche Weise realisieren, indem du via set glob. variablen in jedem call setzt (eine für Nummerierung und eine für den errorlevel) und in den Prompt-String integrierst.
vor Beendigung, am Ende der batch ein
echo.
pause
ließe Dich das Ergebnis auf dem screen sehen
Das müsstets du dann ausprobieren
vg xaver
Hallo Xaver,
natürlich habe ich inzwischen bei meinen verschachtelten Batchdateien die entspr. Stelle gefunden, wenn es auch ein bißchen gedauert hat.
Wenn ich es richtig sehe, zielt Deine Lösung darauf ab, nach jeder Zeile in den Batchdateien eine Debug-Zeile einzufügen.
Ich erinnere mich schwach daran, so etwas über ein Programm mal gemacht zu haben. Könnte aber sein, dass ich dabei auf das Problem gestoßen bin, dass eine ErrorLevel-Prüfung im Originalfile durch eine die dazwischengeschobene Zeile nicht mehr funktioniert hat. Bin mir aber nicht so ganz sicher, da evtl. manche Befehle errorlevel nicht beeinflussen...
Wenn ich mal ein bißchen Ruhe finde, werde ich aber Deine Idee mal genauer anschauen. Pipes habe ich bisher noch nicht groß verwendet.
Ich habe mir vor einiger Zeit eine DOS-Box-Ersatztool (TakeCommand) gekauft, mit dem man u.a. Batchprg. debuggen kann, d.h. Zeile für Zeile ausführen. Das hat zwar ein paar Erweiterungen für PROMPT, aber eben nicht die gewünschte. Ich glaub, ich frag da einfach mal nach, ob eine solche Erweiterung auch eingefügt werden kann...
Viele Grüße,
Mdl
Hi MdI,
was ich mit VARs in Prompt einbauen, verdeutlicht vielleich besser ein screenshot ...
ich habe tatsächlich in einem 'abseitigen' Backup-Ordner noch alte batches aus W95/98-Zeiten gefunden, in denen ich Abfragen des errorlevels benutzt hatte:z.B. #1 Fragt ab welches Laufwerk zugeordner werden soll:
- @echo off
- set key=
- keytest.com
- ******** Laufwerksbuchstabe erwartet *******
- for %%z in (97 98 99 100 101 102 103 104 105 106 107 108 109 110 111) do if errorlevel %%z set key=%%z
- for %%z in (112 113 114 115 116 117 118 119 120 121 122) do if errorlevel %%z set key=%%z
- *** usw. mit ' if not exist "LW" usw ***
z.B. #2 Liest vorhandene Dateien zum Drucken in einem Ordner, Anz. d. Ausdrucke kann angegeben werden:
- set ie=if errorlevel
- set die= do %ie%
- set str=0 1 2 3 4 5 6 7 8 9 10
- ...
- blabla (nacheinander die Druckdateien anzeigen)
- ...
- ******** call-Aufruf **** => Anzahl Ausdrucke? =>
- ******** hier wird der errorlevel z.B. auf den Wert 10 getestet ***
- ******** und 'n' übergeben ...
- :chk
- for %%n in (%str%)%die%%%n set n=%%n
- if "%n%==10" set n=9
- goto print
- ...
- blabla
Ich hatte deshalb gedacht, Du könntest auf ähnlichem Weg Dir eine Screenausgabe über den Prompt erzeugen (s. screenshot)
*** DOS-Box ? 'baust' du per batchaufruf alte games in windows ein?
vg
xaver