Entwickler-Ecke
Windows API - Beendigung einer Batchdatei erkennen?
hsl - Fr 08.08.08 12:57
Titel: Beendigung einer Batchdatei erkennen?
Hallo,
ich rufe aus meinem in Delphi5 (unter Win XP SP2) geschriebenen Programm mit
Delphi-Quelltext
1:
| ShellExecute(Application.Handle, 'open', 'F:\makesik.bat', nil, nil, SW_SHOW); |
eine Batchdatei auf, in der nur ein xcopy-Befehl steht (xcopy ist vielseitig und trotzdem schön einfach). Danach läuft der Kopiervorgang in der DOS-Box und mein Programm läuft auch weiter, ich kann es sogar beenden, es wird trotzdem zu Ende kopiert.
Wie kann mein Programm abfragen oder erkennen, ob das Batchprogramm (also der Kopiervorgang) beendet ist, damit es dann erst weitermacht?
Mit Dank im Voraus
Gruß
hsl
Moderiert von
Narses: Delphi-Tags hinzugefügtModeriert von
Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Fr 08.08.2008 um 14:12
delphi10 - Fr 08.08.08 17:55
Hi
Bevor das hier noch komplizierter wird: Starte XCopy wie folgt "Start /Wait XCopy /Parameter"
Die Batch wird nicht fortgesetzt, bevor XCopy fertig ist. Damit ist der Zustand der Batch immer eindeutig. So mußt Du nicht mehr abfragen, ob XCopy fertig ist, wenn Dein Programm den Focus zurück hat, ist die Batch abgearbeitet.
Gruß Delphi10
Timosch - Fr 08.08.08 18:15
delphi10 hat folgendes geschrieben: |
Hi
Bevor das hier noch komplizierter wird: Starte XCopy wie folgt "Start /Wait XCopy /Parameter"
Die Batch wird nicht fortgesetzt, bevor XCopy fertig ist. Damit ist der Zustand der Batch immer eindeutig. So mußt Du nicht mehr abfragen, ob XCopy fertig ist, wenn Dein Programm den Focus zurück hat, ist die Batch abgearbeitet.
Gruß Delphi10 |
Das reicht aber noch nicht. Sein Programm läuft schließlich weiter, auch im Hintergrund. Er muss rausfinden, wann die Batch fertig ist. Und ich frage mich, wieso er überhaupt eine Batch nimmt. Für einen einzelnen Befehl ist das doch völlig unnötig...
delphi10 - Fr 08.08.08 18:32
Na ja, nicht unbedingt. Er muß das alles natürlich in einen einen Loop packen, in der sowas wie ein DOSExitCode abgefragt wird. Dieser DOSExitCode wird dann in der letzten Batch-Zeile definiert. Oder, etwas unorthodox, in der letzten Zeile eine Datei anlegen, in Delphi warten bis die auftaucht, Datei löschen und weiter. Ja, ja - ich weiß - aber diese kleinen bad-Tricks sind überschaubar und sie funktionieren ohne das man sich mit WindowsAPI die Ohren bricht. Und wenn man schon zum kopieren von Dateien auf die DOS-Ebene zurückfällt, dann fallen solche Sachen auch nicht mehr ins Gewicht. Unter Borland(Turbo)-Pascal gab es die Variable DOSExitCode. Etwas äquivalentes in Delphi habe ich noch nicht gefunden, wirds aber wohl geben. Wenn ihn jemand kennt, bitte mal posten. Danke
Gruß Delphi10
Timosch - Sa 09.08.08 12:02
Aber warum das ganze? Wenn er einfach direkt - ohne den Umweg über die Batch - xcopy aufrufen würde, könnte er all die Möglichkeiten aus den verlinkten Threads verwenden, z.B. über WaitForSingleObject. Das ist wesentlich komfortabler und nicht so hässlich wie die Methode mit der Datei. Aber irgendwie scheint sich hsl nicht mehr zu melden...
hsl - Fr 22.08.08 21:08
Hallo und vielen Dank an alle, die mir geholfen haben.
Ich war ein paar Tage verreist und habe mich deswegen nicht kümmern können. Da ich eh nur ein autodidaktischer Gelegenheitsprogrammierer bin und mich in den Bereichen, in denen Delphi die Ressourcen von Windows benutzt, überhaupt nicht auskenne, werde ich jetzt eine Weile brauchen, um mir die Vorschläge anzusehen und auszuprobieren. Wenn es einen Befehl gibt, der unter Delphi ganze Verzeichnisstrukturen unter Abfrage des Archivattributs kopiert, dann hätte ich es einfacher.
Gruß
hsl
jaenicke - Fr 22.08.08 22:54
Ich frage mich wofür eigentlich so viel Aufwand betrieben werden soll, schließlich wäre es doch viel einfacher den Kopiervorgang direkt in Delphi umzusetzen, dann hast du (vermutlich) nur wenige Zeilen Code und damit hat sich die Sache. xcopy hat zwar auch ein paar Parameter, die ein paar mehr Zeilen erfordern, aber die Frage ist eigentlich welche dieser speziellen Parameter du wirklich brauchst.
Beispiel:
http://www.swissdelphicenter.ch/de/showcode.php?id=152
Ob man z.B. die Fortschrittsanzeige von Windows sehen möchte oder nicht, kann man einstellen, es geht vieles:
http://msdn.microsoft.com/en-us/library/bb762164(VS.85).aspx
// EDIT: Das mit dem Archivattribut hab ich eben erst gelesen, das kann man zumindest manuell auf jeden Fall berücksichtigen.
Da es nicht viel bringt, es zu benutzen, bzw. fehleranfällig ist, weiß ich nicht, ob es auch direkt mit dieser Funktion geht, aber ich werde nachschauen.
// EDIT2: Es ist ja kein Problem alle Dateien auch in Unterverzeichnissen mit Archivattribut zu finden, und mit dieser Unit um SHFileOperation herum und dem Attribut fofNoConfirmMakeDir muss man sich auch nicht um das Anlegen der Zielordnerstruktur kümmern:
http://www.delphipraxis.net/topic50381_wrapperunit+fuer+shfileoperation.html
Zum Suchen der Dateien:
http://www.delphi-library.de/viewtopic.php?t=94
Es muss ja nur noch in Zeile 10 das Archivattribut mit abgefragt werden, und dann die Ergebnisstringliste als Quelle gesetzt werden, dann der Ursprungsordner in jedem Eintrag durch das Ziel ersetzt werden und das dann als Zielliste gesetzt werden.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!