Hallo!
Ich will auf wunsch Ergebnisse in einer Protokolldatei speichern, wie mach ich das am besten?
Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge
Hi!
In DOS wird das automatische Erstellen von Protokolldateien (zumindest das Umleiten der Ausgabe auf CON) direkt unterstützt und muss nicht extra programmiert werden
wenn ;-)
der Compiler keine speziellen Routinen zum direkten Schreiben in den Bildschirmspeicher nutzt (z.B. wie in TurboPascal die Unit CRT).
Ob und wie der Compiler die Standardausgabe umleitet, sollte eigentlich in seiner Doku aufgeführt sein.
Wenn der Copiler die DOS-Umleitung zulässt, dann kann man die Textausgabe in eine Datei umleiten:
demotool >datei.txt
OK, oft geht das nicht (z.B. weil man in TP auf die Fähigkeiten von CRT licht verzichten will). Evtl. bietet der Compiler dann die Möglichkeit zumindest die Ausgabe auf CON wieder auf die DOS-Routinen umzuleiten.
Beispiel für TurboPascal 7.0:
assign(output,'');
rewrite(output);
Wenn das auch nicht geht, dann musst du die Protokollierung von Hand machen. Am besten realisiert du einen Parameter in deinem Programm, der die Protokollierung anstöst.
Entweder schreibst du eine eigene Funktion zur Textausgabe (writeinfo), die bei gesetzten Protokoll-Parameter in eine Datei schreibt oder du fügst spezielle Protokollfunktionen in dein Programm ein, die dann die gewünschte Info in die Protokolldateien schreiben.
Ich hoffe, das hilft dir weiter.
Bis denn
Andreas
Hallo!
Ich habe da noch nicht so die ahnung ich bin totaler Anfänger und arbeite gerade alte Aufgaben hefte durch ums mir selbst beizubringen!
Und ich denke ich habe soweit alles richtig gemacht bloß das speichern der Protokolldatei weiß ich nicht. Also soweit war ich:
@echo off
find "%1" %2 /l /%3 /%
for %%A IN (%2) Do echo %2
if/%3=/c goto Find1
if/%4=/c goto Find1
:Find1
find "%1" %2 /l/c
for %%A IN (%2) Do echo %2
so und nun müßte auf wunsch noch das speichern der Protokolldatei kommen!
Hi!
Das sieht ja nun doch ganz anders aus. Meine erste Antwort bezog sich auf das Programmieren einer Protokollausgabe mit einer echten Programmiersprache. In der guten alten Batch-Sprache muss man das etwas anders erledigen. ;-)
Du weisst, dass du die Ausgabe von DOS-Befehlen in Dateien umleiten kannst? Das geht natürlich auch mit den Btch-Befehlen.
Beispiel:
REM Hallo in datei demo.txt schreiben:
echo hallo! >demo.txt
Dabei wird demo.txt neu angelegt. Will man etwas eine vorhandene Datei anfügen, dann geht das auch:
REM Wech! an Datei demo.txt anfügen:
echo wech! >>demo.txt
Dein Demo-Batch ist mir aber noch nicht ganz klar, weil :Find1 immer ausgeführt wird und nicht nur wenn der Parameter /C angegeben wurde.
Bis denn
Andreas
Hallo!
Ja hab gesehen was du meinst!
@echo off
find "%1" %2 /l /%3 /%4 Hier sucht er ja schon den Suchtext in einer Datei und berücksichtigt ja auch die optionen. Also auch /l für das ignorieren der Groß- u. Kleinschreibung und wenn ich jetzt beim /%3 das /c angegeben hätte würde er ja auch schon die Zeilen mit der Zeichenkette mitzählen, was er ja nur auf Wunsch machen soll.
for %%A IN (%2) Do echo %2 Damit gibt er den Datei Namen aus, der den Suchtext beinhaltet, weil er ja mehrere Dateien durchsuchen kann, die müssen ja nur durch eine Leertaste getrennt eingegeben werden, reicht dafür ein Platzhalter?
if/%3=/c goto find1 Ist ja dann sowieso schwachsinig, weil er es ja in dem fall dann eh schon mit gemacht hätte!?
Nun weiß ich garnicht mehr wie ich das alles machen soll?
Hi!
Es wird in jedem fall kompliziert und erreicht IMHO die Grenzen mit DOS-Batch Machbaren.
Solche Aufgaben hab' ich dann eher in einem neuen Pascal-Programm umgesetzt. ;-)
OK. Zu den einzelnen Fragen/Details:
>for %%A IN (%2) Do echo %2 Damit gibt er den Datei Namen aus,
>der den Suchtext beinhaltet, weil er ja mehrere Dateien
>durchsuchen kann, die müssen ja nur durch eine Leertaste
>getrennt eingegeben werden, reicht dafür ein Platzhalter?
Nein, in %2 steht immer nur genau der zweite Parameter.
Allerdings gibt es den Befehl SHIFT. Der schiebt die Parameter um eine Stelle nach "Links": %2 wird zu %1, %3 wird zu %2 usw.
Wenn du nun die Protokolierung abhängig von einem Parameter umsetzen willst UND mehrere Filenamen durchsuchen willst, dann muss man die Syntax des neuen Batch streng festlegen (naja, ist auch nur ein Vorschlag):
batch suchstring param1 param2 datei1 datei2 (..dateix)
Und die Bearbeitung im Batch etwas flexibler gestallten. Dazu muss man IMHO mit einigen variablen zur Steuerung arbeiten.
Der Suchstring muss immer angegeben werden, also speicherst du ihn in einer Variable ab und eine Variable für die Protokolierung löschen wir erstmal:
@echo on
rem Damit man was sieht.. ;-)
set suchstring=%1
rem Voreinstellung: kein Protokoll und keine Zählen:
set proto=
set count=
Den Parameter /C und den neuen Protokoll Parameter /P wird zusammen ausgewertet, da man ja nicht wissen kann, ob sie angegeben wurden oder nicht. Sie werden in Variablen gespeichert:
:PLOOP
if "%2"=="/C" then goto USEC
if "%2"=="/c" then goto USEC
if "%2"=="/P" then goto USEP
if "%2"=="/p" then goto USEP
rem Kein Parameter gefunden, also ist %2 ein Dateiname!
:DLOOP
rem Wenn %2 leer ist, dann ist alles aus...
if "%2"=="" goto ENDE
rem Mit dem aktuellen Namen in %2 suchen:
find "%suchstring%" %2 /l %COUNT%
rem Aus den nächsten Namen setzen:
shift
goto DLOOP
rem Parameterbehandlung:
:USEC
set count=/C
shift
goto PLOOP
:USEP
set proto==JA!
shift
goto PLOOP
:ENDE
echo Das war's
Warum du nochmal mit FOR die gefunden Dateinamen ausgegeben willst, verstehe ich nicht (und das funktioniert auch nicht, da du ja nirgends abfragst, ob in %2 überhaupt etwas gefunden wurde (ich meine wie soll FOR wissen, das FIND was gefunden hat?).
SO, was jetzt noch fehlt ist die Protokolierung. Den Test, ob mein Batch überhaupt funktioniert, überlasse ich dir. ;-)
Naja, mit IF kann man auch abfragen, ob etwas nicht der Fall ist:
if not "%proto"=="" goto irgendwo
Ich glaube, damit sollte man dann weiter kommen, oder? ;-)
Bis denn
Andreas
Hallo!
Was ist wenn beide optionen angegeben wurden, /c /p, da für beide ja nur %2 angegeben ist, bei :PLOOP? Und wenn sie dort angegeben sind springen wir zu :USEC, setzt count=/c, (shift für mehrere Dateien?), und dann wieder goto PLOOP, dann fängt er doch wieder dort an und wir sitzen in einer schleife fest!? Ohne je dazu zu kommen ob /p auch angegeben wurde oder? Und noch eine frage, was bedeutet %COUNT% ???
Ich glaube du hast es nicht einfach mit mir und danke schon mal das du mir hilfst!!!
Hi!
Wenn du genau hinsiehst, merkst du dass für die weiteren Untersuchungen der Parameter (und später für die eigentliche Suche) immer %2 genommen wird. ;-)
Durch die Verwendung von SHIFT steht dort aber immer ein anderes Parameter: Zuerst das zweite, dann (nach dem 1. Shift) das zweite dann das dritte, usw.
Nehmen wir an %2 ist /C und %3 ist /P. Wenn wir das erste Mal an :PLOOP (für Prameter-Verarbeitungs-Loop) vorbeikommen, wird "/C" erkannt und mit :USEC weitergemacht.
In USEC wird count gesetzt und dann SHIFT ausgeführt. Jetzt ist %2 mit /P belegt (weil die Parameter ja mit SHIFT nach Links "wandern".
OK, weiter geht's mit PLOOP. (Dann folgt USEP, SHIFT und wieder PLOOP).
Das letzte SHIPT hat nun wieder die Parameter verschoben. Jetzt steht der ursprüngliche Inhalt von %4 in %2. Das sollte jetzt ein zu durchsuchender Filename sein.
OK, die IF-Befhele nach PLOOP finden kein /C oder /P in %2, also landen wir bei DLOOP (für Datei-Verarbeitungs-Loop).
Hier testen wir zuerst, ob %2 leer ist. Wenn in %2 nichts steht, dann wird der Batch beendet.
Wenn aber in %2 etwas enthalten war, dann wird der FIND-Befehl ausgeführt. Dann kommt wieder SHIFT. Und weiter geht's mit DLOOP.
Was steht jetzt in %2? Naja, entweder nichts oder eine weiterer Filename.
Was %varname% bedeutet? Naja, irgendwie muss man ja den Inhalt einer Variable ausgegeben können - immer nur Werte reinschreiben, ist ja auf Dauer doch etwas öde. ;-)
Bis denn
Andreas
Hallöchen!
OK das ist mir jetzt soweit klar, denn Parameter für die protokollierung haben wir jetzt auch gesetzt, falls er angegeben wurde aber wie und wo wird sie gespeichert?
Hi!
Noch gar nicht. ich wollte nicht alles auf einmal machen und dir nochwas übriglassen. :)
Bis denn
Andreas
OK!
Äh und Danke noch mal!!!
mfg Andrea :-)