Frage von f1atlux, 39

Batch Skripte unter Windows - was ist möglich?

Guten Abend,

kann mir jemand sagen ob so etwas in der Art mit Batch-Files prinzipiell möglich wäre:

  • Lese zeilenweise aus CSV-Datei
  • Übergib dies und das aus der Datei als Parameter an Programm
  • Prüfe auf Fehlerrückgabe
  • Schreibe Erfolg / Fehler mit Zeitstempel in Logdatei

Unter UNIX hat man ja die ganzen kleinen Helferlein wie sort, grep, sed, awk usw. Ich bin um jeden Rat dankbar.

Antwort
von S1r1us13, 23
FOR /F "tokens=1,2,3,4 delims=;" %%A IN (Datei.csv) DO start Programm %%A %%B %%C %%D && echo %date% %time% Erfolg >> Logdatei || echo %date% %time% Fehler >> Logdatei

1. Lies zeilenweise aus CSV-Datei
Wird ermöglicht durch den FOR-Befehl. Für jede Zeile in "Datei.csv" wird die Befehlsfolge hinter "DO" ausgeführt.

2. Übergib dies und das aus der Datei als Parameter an Programm
Wird ermöglich durch die "tokens". Zellen in CSV-Dateien sind durch Semikolons getrennt, was in dem FOR-Befehl als "delims=;" (engl. "delimiters") übernommen wird. Spalte 1, 2, 3, 4 usw. muss man in "tokens" einzeln erwähnen. Die Spalteninhalte werden nach "DO" mit %%A, %%B, %%C, %%D usw. aufgerufen.

3. Prüfe auf Fehlerrückgabe
Das zu startende Programm muss einen Fehlercode nach vollendeter Ausführung zurückgeben, der von CMD erkannt wird, damit diese Methode funktioniert. Mit " || " wird der nachfolgende Befehl nur ausgeführt, wenn der vorige erfolglos war. Mit "&&" wird der nachfolgende Befehl nur ausgeführt, wenn der vorige erfolgreich war. Eine Kombination beider Prüfungen ist, wie oben im Beispiel, möglich.

4. Schreib Erfolg / Fehler mit Zeitstempel in die Logdatei
Mit dem ECHO-Befehl und den entsprechenden (von Windows voreingestellten) Variablen kann man einen Zeitstempel in eine Datei schreiben.

Zu ersetzende Teile in obiger Befehlsfolge sind "Datei.csv", "Programm" und "Logdatei". Je nach auszuwertenden Spalten auch die Zahlen hinter "tokens", getrennt durch Kommas. Sind einige Spalten irrelevant, kannst du sie auch überspringen mit z. B. "tokens=1,2,6,9". Dann entspricht die 6. Spalte aber %%C und die 9. Spalte ist %%D.

Kommentar von f1atlux ,

Den Nagel auf den Kopf getroffen!

Danke für deine ausführliche Antwort.

Antwort
von grtgrt, 22

Für dein Vorhaben am besten geeignet ist VBScript, da

  • man über VBScript die COM-Schnittstelle aufrufen kann, d.h. alle Funktionalität von EXCEL
  • und VBscript erlaubt, ausführliches Error-Handling zu programmieren.
  • Auch Code, der notwendig werden könnte, die gelesenen Daten weiter zu verarbeiten, ist in VBScript leicht realisierbar.

Nebenbei noch: 

Alle unter UNIX verfügbaren, von dir genannten "kleinen Helferlein" sind auch für MS Windows verfügbar ( siehe http://www.heise.de/download/gnu-utilities-for-win32-117273.html ).

Kommentar von grtgrt ,

Um dich mit VBScript bekannt zu machen, beginne auf Seite https://msdn.microsoft.com/en-us/library/d1wf56tt(v=vs.84).aspx .

Kommentar von f1atlux ,

Danke auch für deine Antwort! Es fallen halt hier und da mal ein paar kleinere Aufgaben unter Windows bei mir an, für die ein Skript schnell zusammengeschrieben ist.

Die GNU Utils kommen gleich mal in die PATH-Variable :)

Antwort
von ThomasAral, 39

der 3te Teil wird schwer funktionieren .. dazu müsste dein programm was machen dass es normal nicht macht.  Umgebungsvariablen anlegen, oder selbst eine Datei schreiben die du dann wieder ausliest. das problem ist also weniger das script, sondern mehr das fernzusteuernde programm.  Aber in manchen Fällen gehts natürlich.  Besonders wenn du beides schreibst:  Script und Programm.

Kommentar von ThomasAral ,

unter Windows schreibt man aber heutzutage nicht mehr DOS Batches... sondern VBS  (Visual Basic Script)  das mit VBA Verwand ist ... siehe Excel und Word Makros.  Übrigens einer der berühmtesten Viren wurde mit VBS programmiert und per Email versand.

Kommentar von ThomasAral ,

seit dem blockt outlook standardmäßig VBS --- und ich denke sogar VBS in ZIP verpackt ... du musst die Endung ändern ums per Email an Outlook Email Clients zu senden.

Kommentar von f1atlux ,

Danke erstmal für deine Antwort.

Naja bei jedem Programm gibt es ja return-Codes: 0 für fehlerfrei und irgendwas ungleich null ist dann der Fehlercode. Die Frage ist nur, wie man das in einem Batch-Skript behandelt.

Kommentar von ThomasAral ,

unter windows gibts das nur noch selten ... und um das abzufragen müsstest du eine sogenannte CGI Schnittstele haben ... da ist es lechter  Environment-Variablen zu beschreiben.  Oder eben kleine return.txt  Dateien zu erzeugen.

Kommentar von ThomasAral ,

Hab mich damit auch schon rumgeärgert --- wollte ein CompactFlash Tool fernsteuern, so dass man von meinem Programm gar nicht merkt dass ein Fremdtool die eigentliche Arbeit macht.  das Programm gibt aber nix zurück .. selbst wenn ein Fehler auftaucht.  Und dann denkst die Arbeit (Karte formatieren mit Betriebssystem) ist erledigt .. ist sie aber nicht .. und keiner weiss warum.  Ich muss also die Oberfläche des Fremdprogramms anzeigen, damit der Bediener im Fehlerfall sieht was Sache ist.  Selbst programmieren geht nicht, da ich die Herstellerinfos nicht habe die nötig sind um die eigenen CompactFlash Karte richtig zu partitionieren und zu formatieren.

Keine passende Antwort gefunden?

Fragen Sie die Community