Autor |
Beitrag |
hsl
Hält's aus hier
Beiträge: 2
|
Verfasst: Fr 08.08.08 12:57
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
|
|
Timosch
      
Beiträge: 1314
Debian Squeeze, Win 7 Prof.
D7 Pers
|
Verfasst: Fr 08.08.08 13:07
www.delphi-forum.de/viewtopic.php?t=75310, insbesondere der letzte Beitrag von AHT; das müsste auch auf Batches anwendbar sein.
Wieso rufst du den xcopy-Befehl eigentlich nicht gleich über ShellExecute auf? Den Umweg über die Batch könntest du dir doch eigentlich sparen... Dann wirds auch wesentlich einfacher, denn eine Batch läuft nicht als eigener Prozess, sondern in einer cmd.exe/command.com; wenn du xcopy mit Parametern direkt aufrufst, läuft es als einzelner Prozess. Dazu auch www.delphi-forum.de/viewtopic.php?t=53070.
In www.delphi-forum.de/viewtopic.php?t=82439 stehst auch was dazu.
_________________ If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell
Zuletzt bearbeitet von Timosch am Fr 08.08.08 13:11, insgesamt 2-mal bearbeitet
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Fr 08.08.08 13:08
Alternativ siehe hier oder auch hier. 
|
|
delphi10
      
Beiträge: 447
Erhaltene Danke: 2
W2K, XP, Vista64, Win7 64
RAD-Studio 2010
|
Verfasst: 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
_________________ Salus populi suprema lex esto
|
|
Timosch
      
Beiträge: 1314
Debian Squeeze, Win 7 Prof.
D7 Pers
|
Verfasst: 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...
_________________ If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell
|
|
delphi10
      
Beiträge: 447
Erhaltene Danke: 2
W2K, XP, Vista64, Win7 64
RAD-Studio 2010
|
Verfasst: 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
_________________ Salus populi suprema lex esto
|
|
Timosch
      
Beiträge: 1314
Debian Squeeze, Win 7 Prof.
D7 Pers
|
Verfasst: 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...
_________________ If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell
|
|
hsl 
Hält's aus hier
Beiträge: 2
|
Verfasst: 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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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:
www.swissdelphicente.../showcode.php?id=152
Ob man z.B. die Fortschrittsanzeige von Windows sehen möchte oder nicht, kann man einstellen, es geht vieles:
msdn.microsoft.com/e...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:
www.delphipraxis.net...shfileoperation.html
Zum Suchen der Dateien:
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.
|
|
|