2012-04-29 12 views
5

Ich finde nicht in der Hilfe eine erschöpfende Erklärung des Unterschieds zwischen Shellexec und Exec. Ist derShellexec vs Exec vs Shellexec meine Batch-Datei

Shellexec('','program.exe',params,'',SW_HIDE,ewWaitUntilTerminated,ResultCode) 

entspricht

Exec('program.exe',params,'',SW_HIDE,ewWaitUntilTerminated,ResultCode) 

bei der Arbeit mit exe-Dateien? Wenn ich eine andere Datei als exe oder Batch ausführen möchte, verwende Shellexec.

Manchmal kann ich jedoch weder von Shellexec noch von Exec korrekt funktionieren. Die einzige Lösung, die immer funktioniert, ist eine Batch-Datei zu schreiben und über shellexec auszuführen. Persönlich mag ich diese Lösung nicht, weil ich mit einer temporären Datei umgehen muss und ich vertraue dem erhaltenen Ergebniscode nicht. Jetzt muss ich zurück zu der Batch-Datei-Lösung, weil ich nicht weiß, wie man diese Anweisung funktioniert: (Der Fehler ist, dass es die Anweisung schlägt fehl, wenn die Zieldatei nicht bereits vorhanden ist, während in Befehl die Eingabeaufforderung funktioniert, auch wenn die Zieldatei nicht existiert).

mysqldump := 'C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin\mysqldump.exe'; 
params := '-uroot -ppassword myschema>C:\myappdir\backup\newbackup.sql'; 
//the destination folder exists, the file newbackup.sql does not exist  
Shellexec('',mysqldump,params,'',SW_HIDE,ewWaitUntilTerminated,ResultCode); 

Ich arbeite auf Windows 7 64-Bit, das Programm (ein Inno Setup Installer) mit Administratorrechten ausgeführt wird

+1

Auf jeden Fall verwenden, um die '{}' pf32 Konstante anstelle von 'C: \ Program Files (x86)'. Es gibt Ihnen den richtigen Pfad zum 32-Bit-Programmverzeichnis zurück. Ich denke, es könnte die Ursache Ihres Problems sein, aber schwer zu sagen. Sie können auch prüfen, ob die Datei mit der Funktion 'FileExists 'existiert, bevor Sie versuchen, sie auszuführen. – TLama

Antwort

4

In dieser Situation in Inno Setup sind die beiden Anrufe ziemlich identisch. Wenn das Setup jedoch mit den niedrigsten Privilegien ausgeführt wird und Sie versuchen, einen Prozess auszuführen, der eine Erhöhung erfordert, wird ShellExec() die Eingabeaufforderung zulassen, während Exec() fehlschlägt.

Die Unterschiede zwischen den beiden treten auf, wenn einzelne monolithische Befehlszeilen übergeben, nicht ausführbare Dateien übergeben oder andere Verben als "open" verwendet werden.

Beachten Sie, dass Sie mit keiner dieser Funktionen Befehle oder Operationen ausführen können, die vom Befehlsinterpreter wie der Umleitungsoperator (... > ...) bereitgestellt werden. Diese Befehle müssen an {cmd} übergeben werden, damit sie ausgeführt werden können.

Hier einige Luft Code:

mysqldump := 'C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin\mysqldump.exe'; 
params := '-uroot -ppassword myschema'; 
dumpfile : = 'C:\myappdir\backup\newbackup.sql'; 

command := AddQuotes(mysqldump) + ' ' + params + ' >' + AddQuotes(dumpfile); 
Exec(ExpandConstant('{cmd}'), '/C ' + command, '', SW_HIDE, ewWaitUntilTerminated, ResultCode); 
+0

+1, die erste Antwort unter Berücksichtigung des InnoSetup-Tags und der Frage selbst! Aber das * behandelt auch die Höhe, wenn der Prozess es braucht, wo CreateProcess() nicht * hier ein wenig verwirrend ist, beide Funktionen 'ShellExec' und' Exec' verwenden die gleichen Rechte wie Setup selbst. – TLama

+1

Ah, ich habe das Inno-Setup-Tag verpasst, in diesem Fall ja, sie sind ziemlich identisch und kommen zum Parsen. Wenn das Setup jedoch als eingeschränkter Benutzer oder "ShellExecAsOriginalUser" ausgeführt wird, wird bei Bedarf eine Erhöhung angefordert. 'Exec()' wird in diesem Fall fehlschlagen. – Deanna

+0

Die Antwort wurde mit Inno neu geschrieben. – Deanna

2

Haben Sie darüber nachgedacht CreateProcess mit dem Prozess zu beginnen? Dieser Aufruf bietet einige zusätzliche Optionen, um den resultierenden Prozess zu steuern, und kann auch die übergebenen Parameter besser verarbeiten.

+0

+1 für CreateProcess –

+0

Vielen Dank, ich habe diese Anweisung zuvor nicht ausprobiert. Ich habe keine CreateProcess-Anweisung in Innosetup gefunden. Wie auch immer, ich denke, dass es in meinen Delphi-Projekten nützlich sein könnte. Beim Erlernen der Verwendung von CreateProcess stieß ich auf [diese Frage] (http://stackoverflow.com/q/343476/1136458).Mein Befehl funktioniert immer noch nicht, vielleicht wegen der Umleitung der Ausgabe. – lib

+0

Sie müssen möglicherweise keine Umleitung und das Standardverhalten kann nur gut, versuchen Sie es ohne die 'oder STARTF_USESTDHANDLES' und Erstellen/Festlegen der Handles. –

2

Wenn Sie die JEDI JVCL Bibliothek verwenden können, sie haben eine schöne Komponente, die für Sie Create kapselt:

http://jvcl.delphi-jedi.org/

Blick auf die JvCreateProcess und JvCreateProcessExtended Komponenten. Die JEDI JVCL ist kostenlos und Open Source und wird unter der Mozilla Public License veröffentlicht.

Verwandte Themen