7
votes

Shellexec vs exec vs shellexec mon fichier de commandes

Je ne trouve pas dans l'aide une explication exhaustive de la différence entre Shelllexec et EXEC. Est l'équivalent xxx pré>

à p> xxx pré>

lorsque vous travaillez avec des fichiers EXE? Bien sûr, lorsque je veux exécuter un fichier différent de l'EXE ou du lot, utilisez Shellexec. P>

Parfois, je ne peux pas obtenir mon istroduction de travailler correctement ni par Shelllexec Nor Exec. La seule solution qui fonctionne toujours est d'écrire un fichier de commandes et de l'exécuter via Shellexec. Personnellement, je n'aime pas cette solution car je dois faire face à un fichier temporaire et je ne fais pas confiance au résultat obtenu. Maintenant, je devrai revenir à la solution de fichier de commandes, car je ne sais pas comment obtenir cette instruction fonctionne: (L'erreur est qu'elle soulève que l'instruction échoue si le fichier de destination n'est pas déjà présent, lors de l'invite de commande L'instruction fonctionne même que le fichier de destination n'existe pas). P>

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);


1 commentaires

Utilisez définitivement le {pf32} constant au lieu de c: \ Program Files (x86) . Il vous retourne le chemin correct vers le répertoire des fichiers de programme 32 bits. Je pense que c'est peut-être la cause de votre problème, mais difficile à dire. Vous pouvez également vérifier si le fichier existe avec la fonction FileExist avant d'essayer de l'exécuter.


3 Réponses :


3
votes

Avez-vous envisagé d'utiliser CreateProcess pour démarrer le processus? Cet appel fournit quelques options supplémentaires pour contrôler le processus résultant, et peut également gérer les paramattres passés mieux.


2 commentaires

Merci, je n'ai pas essayé cette instruction auparavant. Je n'ai pas trouvé une instruction CreateProcess dans InnoSetup. Quoi qu'il en soit, je pense que cela peut être utile dans mes projets Delphes. Dans le processus d'apprentissage de l'utilisation de CreateProcess, j'ai rencontré cette question . Mon instruction ne fonctionne toujours pas, peut-être à cause de la redirection de la sortie.


Vous n'avez peut-être pas besoin de redirection et que le comportement par défaut peut simplement faire une amende, d'essayer sans le ou statf_usestdhandles et créer / définir les poignées.



3
votes

Si vous pouvez utiliser la bibliothèque JEDI JVCL, ils ont un bon composant qui encapsule CreateProcess pour vous:

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

Regardez les composants JVCreateProcess et JVCreateProcessExessExessExess. Le Jedi JVCL est libre et open source et est libéré sous la licence publique de Mozilla.


0 commentaires

7
votes

Dans cette situation dans la configuration Inno, les deux appels sont à peu près identiques. Si toutefois, la configuration est en cours d'exécution aux priviligues les plus bas et que vous essayez d'exécuter un processus nécessitant une élévation, shellexec () code> permettra d'inviter tandis que exécuté () code> échouera .

Les différences entre les deux apparaissent lorsque vous passez des lignes de commande monolithiques simples, en passant des non-exécutables, ou lors de l'utilisation de verbes autres que "Ouvrir" p>

Notez que ni la fonction ne Vous permet d'exécuter des commandes ou des opérations fournies par l'interprète de commande comme l'opérateur de redirection ( ...> ... code>). Ces commandes devront être transmises à {cmd} code> pour pouvoir exécuter. P>

Voici quelques indicateurs d'air: P>

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); 


3 commentaires

+1, la première réponse en tenant compte de la balise Innosetup et de la question elle-même! Mais le gère également l'élévation si le processus en a besoin lorsque CreateProcess () ne est un peu déroutant ici, les deux fonctions Shellexec et EXEC utilise les mêmes droits que la configuration elle-même.


Ah, j'ai raté l'étiquette Inno-Setup, dans ce cas Oui, ils sont à peu près identiques et viennent à analyser. Si Howwver, la configuration est exécutée en tant qu'utilisateur limitée, ou shellexecasoriginaluser alors il demandera une élévation si nécessaire. exec () échouera dans ce cas.


Merci! Maintenant, je comprends pourquoi ça n'a pas fonctionné! Désolé pour la balise Delphes en première position, peut-être que c'était trompeur