Autor |
Beitrag |
Addy88
      
Beiträge: 19
Win XP, Win 7
|
Verfasst: Di 29.11.11 00:38
Hallo zusammen,
ich hab mal wieder ein Poblem, ich versuche Apache-Ant aus Delphi heraus aufzurufen. Das sieht wie folgt aus:
Delphi-Quelltext 1: 2: 3: 4:
| aufruf:=('"'+ant_home+'\bin\ant.bat" -Dproject='+project+' -Dsource_version='+source_version+' -Dtarget_version='+target_version+' -f "'+workdir+'\build_system.xml" new'); ExecResult:=ShellExecute(handle, 'open', PWideChar(aufruf), nil, nil, SW_SHOW); edit5.Text:=aufruf; ShowMessage(inttostr(ExecResult)); |
wenn ich die Ausgabe des Edit Feldes in die CMD eingebe dann läuft das auch, allerdings bekomme ich wenn ich das ShellExecute ausführe immer den RetunCode=2
Weiß hier einer Rat?
Danke im voraus.
|
|
SvenAbeln
      
Beiträge: 334
Erhaltene Danke: 3
|
Verfasst: Di 29.11.11 02:36
Die Parameter für das aufgerufene Programm gehören im Aufruf in einen eigenen Parameter:
Delphi-Quelltext 1: 2: 3: 4: 5:
| aufruf:='"'+ant_home+'\bin\ant.bat"'; parameter = '-Dproject='+project+' -Dsource_version='+source_version+' -Dtarget_version='+target_version+' -f "'+workdir+'\build_system.xml" new'; ExecResult:=ShellExecute(handle, 'open', PChar(aufruf), PChar(parameter), nil, SW_SHOW); edit5.Text:=aufruf; ShowMessage(inttostr(ExecResult)); |
|
|
Addy88 
      
Beiträge: 19
Win XP, Win 7
|
Verfasst: Di 29.11.11 19:47
Hi,
danke erstmal, allerdings funktioniert es so immernoch nicht.
Nun bekomm ich den ReturnCode 42.
Wenn ich die Ausgabe der beiden Variablen in der CMD ausführe funktioniert es wieder.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 29.11.11 20:15
|
|
Addy88 
      
Beiträge: 19
Win XP, Win 7
|
Verfasst: Di 29.11.11 20:24
Also das Ant Script schreibt bei der Ausführung direkt ein log, und ich habe fürs testen erstmal einen sleep Task von 2 Minuten eingebaut.
Allerdings wird das log nicht geschrieben und auch das sleep wird scheinbar nicht ausgeführt da ich direkt nach dem klick auf den Start Button die Message mit dem ReturnCode bekomme.
Ich geh ja mal stark davon aus das shellexecute solange wartet bis das aufgerufene Programm ausgeführt wurde?!
Edit:
wenn ich bei parameter noch ">> test.log" anhänge schreibt er mir ein leeres file
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 29.11.11 20:37
Addy88 hat folgendes geschrieben : | Ich geh ja mal stark davon aus das shellexecute solange wartet bis das aufgerufene Programm ausgeführt wurde?! |
Nein, warum sollte es? Das würde ja alles blockieren.
// EDIT:
Versuche als Befehl doch einmal die cmd.exe mit deinem Befehl als Parameter. Dann kannst du die gesamte Ausgabe in eine Datei schreiben. Davon abgesehen kannst du auch einfach die Ausgabe des Aufrufs einmal auslesen, Code dafür findest du über die Suche.
|
|
Addy88 
      
Beiträge: 19
Win XP, Win 7
|
Verfasst: Di 29.11.11 21:00
Ich habs jetzt mal so gemacht:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| if checkbox1.Checked=true then begin params:=('"'+ant_home+'\bin\ant.bat" -Dproject='+project+' -Dsource_version='+source_version+' -Dtarget_version='+target_version+' -f "'+workdir+'\build_system.xml" new >>test.log'); ExecResult:=ShellExecute(handle, 'open', 'cmd.exe', PChar(params), nil, 0); ShowMessage(inttostr(ExecResult)); end; |
Das logfile bleibt trotzdem leer.
Also es sieht mir so aus als würde er zwar die ant.bat aufrufen aber nichts übergeben
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 29.11.11 21:04
Du solltest dir erstmal die Parameter der cmd.exe anschauen...
Da fehlt ein /c vor dem auszuführenden Befehl...
|
|
Addy88 
      
Beiträge: 19
Win XP, Win 7
|
Verfasst: Di 29.11.11 21:05
Sorry, du hast natürlich recht.... Wird langsam schlimm mit mir -.- Moderiert von Narses: Beiträge zusammengefasst Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| if checkbox1.Checked=true then begin params:=('/C "'+ant_home+'\bin\ant.bat" -Dproject='+project+' -Dsource_version='+source_version+' -Dtarget_version='+target_version+' -f "'+workdir+'\build_system.xml" new >>test.log'); ExecResult:=ShellExecute(handle, 'open', 'cmd.exe', PChar(params), nil, SW_SHOW); ShowMessage(inttostr(ExecResult)); end; |
So nun seh ich kurz ein CMD Fenster aufblinken welches sich sofort wieder schließt, das log bleibt leer.
An der maskierung der variablen in params kann es nicht liegen?
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 29.11.11 21:11
Dann probiere /k statt /c damit es da bleibt. 
|
|
Addy88 
      
Beiträge: 19
Win XP, Win 7
|
Verfasst: Di 29.11.11 21:19
 wieder was gelernt
wir kommen der sache näher:
Der Befehl "C:\Program" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
ant_home hat Wert:
C:\Program Files (x86)\NetBeans 7.0.1\java\ant
Und sollte ja anhand der " passend maskiert werden damit in der CMD eben die Leerzeichen nicht stören
|
|
Addy88 
      
Beiträge: 19
Win XP, Win 7
|
Verfasst: Do 08.12.11 13:43
So nach langem hin und her probieren bin ich immer noch nicht zu einem funktionierendem Ergebnis gekommen.
Ich habs jetzt mal so gemacht um zu sehen ob die Maskierung von Pfaden mit Leerzeichen funktioniert:
Delphi-Quelltext 1: 2: 3: 4: 5:
| begin params:=('/K "c:\Program Files (x86)\NetBeans 7.0.1\java\ant\bin\ant.bat" -Dproject='+project+' -Dsource_version='+source_version+' -Dtarget_version='+target_version+' "-f d:\build_system.xml" new ">> test.log"'); ExecResult:=ShellExecute(handle, 'open', 'CMD', PChar(params), nil, SW_SHOW); ShowMessage(inttostr(ExecResult)); end; |
Da ich in der Kommandozeile jedoch immer den folgenden Fehler bekomme, scheint es, als ob mit der Maskierung definitiv irgendwas verkehrt ist:
"Der Befehl "c:\Program" ist entweder falsch geschrieben oder konnte nicht gefunden werden."
Hat hier denn keiner noch irgendeine Idee?
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Do 08.12.11 14:00
der Teil bis "+project+" sollte funktionieren, stecken in den Variablen auch noch nicht gequotete Pfadangaben?
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
Addy88 
      
Beiträge: 19
Win XP, Win 7
|
Verfasst: Do 08.12.11 14:14
Hey, nein in den folgenden Variablen sind keine Pfadangaben mehr enthalten. "c:\Program Files (x86)\NetBeans 7.0.1\java\ant\bin\ant.bat" ist die einzigste Pfadangabe die so beginnt, nach -f ist noch eine aber da sind in der jetzigen Variante keine Leerzeichen drin. Deswegen sieht es mir eben so aus als ob die "" am Anfang schon komplett ignoriert werden. Wenn ich "c:\Program Files (x86)\NetBeans 7.0.1\java\ant\bin\ant.bat" allerdings als auszuführende Datei angebe wird die ant.bat aufgerufen allerdings sofort wieder geschlossen da keine Parameter übergeben wurden. Also ist meine Vermutung das es lediglich bei der Parameterübergabe ein Problem mit der Maskierung gibt.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 08.12.11 14:19
Das Problem ist, dass bereits bei der ersten Parameterübergabe (an die cmd.exe) die Anführungszeichen entfernt werden. Diese setzt die nicht wieder.
Erstelle eine temporäre Batchdatei und führe die aus oder starte eine cmd.exe permanent und übergib die Befehle per Pipe. Letzteres geht mit TDosCommand oder so ähnlich sehr einfach.
|
|