2009-11-12 14 views
3

Actuellement, je travaille dans une application Delphi. J'ai besoin d'exécuter le script Perl depuis l'application Delphi. Pour être plus clair, manuellement nous exécutons le script perl dans la fenêtre unix. Maintenant, j'ai besoin d'automatiser l'exécution de ce script perl depuis l'application.Comment automatiser le script Perl dans Delphi?

J'ai essayé d'utiliser ShellExecute:

ShellExecute(Handle, 'open', PChar('C:\loaderperl.bat'), nil, nil, SW_SHOW); 

La fenêtre clignote pendant une seconde et fermé. Je ne sais pas si le script a été exécuté ou non.

Salut, Merci pour toutes vos réponses et désolé pour ma réponse en retard. Je suis toujours aux prises avec cette automatisation. Maintenant, je vais expliquer le processus clairement, à l'heure actuelle, j'ouvre la fenêtre de mastic, se connecter à la machine distante et exécuter le script Perl. Le script perl appelle à son tour une procédure de stockage et met à jour la table. Maintenant, je veux faire au-dessus du processus expliqué automatiquement en cliquant sur un bouton. Donc, quand je clique sur un bouton, il devrait appeler une fonction qui se connecte à l'ordinateur distant, puis exécute le script Perl. Suis-je clair pour toi ??? S'il vous plaît, aidez à résoudre cela. J'ai besoin de ce code dans Delphi

+0

Est-ce delphi natif ou .NET? Que voulez-vous dire par fenêtre unix? –

+0

Veuillez préciser si vous voulez l'exécuter localement ou sur un système distant, et si localement quel environnement (CygWin, MSys) ou quel shell (sh, bash, rxvt, ...) vous voulez utiliser. – mghie

+1

Duplicata de http://stackoverflow.com/questions/1454501/how-do-i-run-a-command-line-program-in-delphi – mghie

Répondre

0

Démarrer rsh ou quel que soit vos fenêtres unix est avec les arguments pertinents (interprète perl + script emplacement + nom) en utilisant shellexecute?

1

(Edité en réponse aux commentaires ci-dessous.)

Il y a quelques étapes à ceci: d'abord, fait exécuter le script; En second lieu, vérifier s'il a couru avec succès (à la fois qu'il a réussi à lancer un nouveau processus et que ce processus a réussi.)

Partie 1, l'exécution du script:

Pour exécuter le script à partir de votre application Delphi, utiliser ShellExecuteEx avec le verbe "open" devrait fonctionner (plus de détails dans les drapeaux ci-dessous.) Vous pouvez exécuter le script lui-même s'il est associé à votre exécutable Perl ou exécuter votre exe Perl avec le script comme argument de ligne de commande.

This article ressemble à un bon point de départ pour utiliser cette API et son cousin plus simple ShellExecute.

Les fonctions ShellExecute[Ex] s'attendent généralement à ce que votre application exécute une boucle de message par la suite. Il est peu probable que votre application ne l'est pas, tant que l'utilisateur clique sur le bouton pour démarrer votre application, elle reste inactive, mais si ce n'est pas le cas, vous devez passer le drapeau SEE_MASK_NOASYNC. MSDN a beaucoup d'informations.

Partie 2, vérifier s'il a exécuté avec succès et a réussi dans sa tâche:

Pour voir si le script exécuté, vous devriez obtenir une poignée de processus au début du processus et, s'il y avait un nouveau processus, Vérifiez le code de sortie de cela. Vous devez modifier votre script pour renvoyer un code différent de zéro si sa tâche échoue. (Je ne suis pas familier avec Perl, donc je ne peux pas spécifiquement vous dire comment, mais en général c'est la valeur de retour de la fonction « principale » ou autre fonction première/de démarrage.) Vous pouvez le faire par:

  • Passez le drapeau SEE_MASK_NOCLOSEPROCESS au ShellExecuteEx. Cela remplira le membre hProcess de la structure que vous transmettez avec un handle de processus, s'il a démarré un processus (sinon, vérifiez GetLastError pour savoir pourquoi.) Si c'est tout ce que vous devez savoir (juste si cela a commencé, rien à propos de si cela a fonctionné) alors vous avez terminé.
  • En option: attendre que le processus pour mettre fin à l'aide WaitForSingleObject(YourParamStruct.hProcess, INFINITE) (si vous avez un hProcess valide, bien sûr)
  • Appel GetExitCodeProcess pour trouver le code de sortie. (Vérifiez qu'il renvoie STILL_ACTIVE, et s'il est toujours en cours d'exécution, attendez et essayez à nouveau.) Normalement, il doit quitter avec 0 pour indiquer le succès. Vous devriez modifier votre script de sorte que si quelque chose ne va pas, il retourne non nul. Vous pouvez rendre les codes aussi simples ou complexes que vous le souhaitez - par exemple, retourner 1 pour une erreur, ou faire un certain nombre de codes fragmentés par le type d'erreur. (Évitez d'utiliser 259, car c'est la valeur de STILL_ACTIVE - cela pourrait conduire votre code Delphi dans une boucle infinie, selon son codage, pensant qu'il attend toujours d'obtenir un code de sortie car le script Perl est toujours en cours d'exécution quand ce n'est pas le cas.)

Votre application Delphi peut alors vérifier ce code pour voir si le script Perl a travaillé ou non et faire quelque chose en réponse si elle a échoué - enregistrer un message, indiquer à l'utilisateur, etc.

une autre chose - vous dites que vous voulez juste savoir si le script a été exécuté ou non et ce qui précède devrait le fournir. Étant donné qu'il s'agit d'un script Perl et s'exécute sur la ligne de commande, vous pouvez également obtenir sa sortie, soit pour rechercher les erreurs si vous ne renvoyez pas de code d'erreur, soit pour consigner ou afficher l'utilisateur. Vous pouvez le faire en l'exécutant via CreateProcess et capturing the output. D'après ce que vous dites, c'est probablement trop pour ce que vous cherchez, cependant!

+0

Je voudrais toujours exécuter un shell et lui passer le nom du script en tant que paramètre, pour permettre les caractères génériques, la redirection d'entrée/sortie et similaires. La ligne shebang s'assurera que l'interpréteur perl est démarré. – mghie

+0

Cela ne m'est jamais venu à l'esprit, mghie - bon point! –

+0

Automatiser signifie que l'interruption de l'activité humaine doit être nulle. En cliquant sur un bouton, le code devrait automatiquement exécuter le script Perl. J'ai essayé d'utiliser ShellExecute: ShellExecute (Handle, 'open', Pchar ('C: \ loaderperl.bat'), nil, néant, SW_SHOW); La fenêtre clignote une seconde et est fermée. Je ne sais pas si le script a été exécuté ou non. Pourriez-vous s'il vous plaît me clarifier dans ce domaine? – JVNR

0

Vous devez appeler un programme externe (interpréteur perl pour exécuter sur la machine locale, ssh ou smth comme ceci pour l'exécuter sur une machine distante). Voici une procédure qui appelle un programme externe et attend qu'elle se termine (si vous n'avez pas besoin d'attendre jusqu'à ce qu'elle se termine, supprimez WaitForSingleObject ou appelez simplement ShellExecute comme d'autres personnes ont suggéré).

MISE À JOUR: Pour voir sortie du script, essayez d'utiliser la solution de this article

function ExecAndWait(const FileName, Params: ShortString; const WinState: Word): boolean; export; 
var 
    StartInfo: TStartupInfo; 
    ProcInfo: TProcessInformation; 
    CmdLine: ShortString; 
begin 
    { Put the name of file between quotes, due to spaces in names of files in system Win9x } 
    CmdLine := '"' + Filename + '" ' + Params; 
    FillChar(StartInfo, SizeOf(StartInfo), #0); 
    with StartInfo do 
    begin 
    cb := SizeOf(SUInfo); 
    dwFlags := STARTF_USESHOWWINDOW; 
    wShowWindow := WinState; 
    end; 
    Result := CreateProcess(nil, PChar(String(CmdLine)), nil, nil, false, 
          CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, 
          PChar(ExtractFilePath(Filename)),StartInfo,ProcInfo); 
    { Wait the finish of program } 
    if Result then 
    begin 
    WaitForSingleObject(ProcInfo.hProcess, INFINITE); 
    { Free the Handles } 
    CloseHandle(ProcInfo.hProcess); 
    CloseHandle(ProcInfo.hThread); 
    end; 
end; 
0

Si vous voulez ShellExecute() un fichier batch que vous devez exécuter cmd.exe et passer le script comme paramètre, comme suit:

ShellExecute(Handle, 'open', 'cmd.exe', '/C C:\loaderperl.bat', nil, SW_SHOW); 

Vous pouvez utiliser la redirection de sortie pour capturer la sortie de script dans un fichier. Si vous voulez voir si le script a été exécuté avec succès, vous pouvez (à des fins de test) ajouter pause à la fin de celui-ci.

Questions connexes