Programmieren - alles kontrollieren 4.932 Themen, 20.605 Beiträge

DOS PROMPT Befehl... mit Batch-Quelldatei und Zeilennummer

Mdl / 5 Antworten / Baumansicht Nickles

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

bei Antwort benachrichtigen
xaver4 Mdl

„DOS PROMPT Befehl... mit Batch-Quelldatei und Zeilennummer“

Optionen

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
kannst Du das, event in Verbindung mit errorlevel, auf  Dein Problem anwenden?
(falls die batch nicht stoppt nach dem Aufruf des calls, den errorlevel>>zähler in eine tmp-datei schreiben)

vg xaver
bei Antwort benachrichtigen
Mdl xaver4

„Hi, ich habe zwar seit erscheinen von XP ...“

Optionen

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

bei Antwort benachrichtigen
xaver4 Mdl

„Hallo Xaver, ehrlich gesagt, ich weiß nicht, was Deine ...“

Optionen

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 Cool

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 Unschuldig

vg xaver






bei Antwort benachrichtigen
Mdl xaver4

„Hi Mdl, na gut, ich hätte als Beispiel-Suchstring ...“

Optionen

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 

bei Antwort benachrichtigen
xaver4 Mdl

„Hallo Xaver, natürlich habe ich inzwischen bei meinen ...“

Optionen

Hi MdI,

was ich mit VARs in Prompt einbauen, verdeutlicht vielleich besser ein screenshot ...

Prompt
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

bei Antwort benachrichtigen