Delphi - CreateProcess - Exécuter plusieurs commandes
Je veux réaliser les opérations suivantes avec un CreateProcess() - appel:
- Changer pour un svn de travail-copie
- Exécuter des commandes svn
- De rediriger la sortie vers un fichier
J'ai essayer avec la fonction suivante
procedure TQPortMainForm.CmdMigrationClick(Sender: TObject);
var
StartInfo: TStartupInfo;
ProcInfo: TProcessInformation;
CreateOk: boolean;
input: String;
begin
{ fill with known state }
FillChar(StartInfo, SizeOf(TStartupInfo), #0);
FillChar(ProcInfo, SizeOf(TProcessInformation), #0);
StartInfo.cb := SizeOf(TStartupInfo);
//debug
input := 'D: && cd D:\Qport\trunk\Qport\ && ' + SVN_PATH + ' log > C:\users\PhilippKober\UNIQUE_NAME_BLUB.txt';
CreateOk := CreateProcess(nil, PChar(input), nil, nil, false, CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS, nil,
nil , StartInfo, ProcInfo);
{ check to see if successful }
if CreateOk then
// may or may not be needed. Usually wait for child processes
WaitForSingleObject(ProcInfo.hProcess, INFINITE);
end;
Simplement rien ne se passe. Quelqu'un a une idée comment faire?
Merci,
Philipp
EDIT 1: je suis à l'aide de Delphi XE - Build 7601: Service Pack 1
EDIT 2: Voici la solution:
var
StartInfo: TStartupInfo;
ProcInfo: TProcessInformation;
CreateOk: boolean;
input: String;
path : String;
cmd : String;
begin
{ fill with known state }
FillChar(StartInfo, SizeOf(TStartupInfo), #0);
FillChar(ProcInfo, SizeOf(TProcessInformation), #0);
StartInfo.cb := SizeOf(TStartupInfo);
path := 'D:\Qport\trunk\Qport\';
cmd := 'C:\Windows\System32\cmd.exe';
//debug
input := '/C' + SVN_PATH + ' help > C:\users\PhilippKober\UNIQUE_NAME_BLUB.txt';
CreateOk := CreateProcess(PChar(cmd), PChar(input), nil, nil, false, CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS, nil,
Pchar(path), StartInfo, ProcInfo);
{ check to see if successful }
if CreateOk then
// may or may not be needed. Usually wait for child processes
WaitForSingleObject(ProcInfo.hProcess, INFINITE);
end;
Quelle version de Delphi utilisez-vous?
OriginalL'auteur skylla | 2013-08-02
Vous devez vous connecter pour publier un commentaire.
Vous devez fournir un fichier executable lorsque vous l'appelez
CreateProcess
. Je suppose que vous avez l'habitude d'appelerShellExecute
qui est plus laxistes.Vous sont clairement à la recherche d'appeler
cmd.exe
de sorte que vous devriez ajouter à la ligne de commande. Plutôt que de changer le répertoire de travail aprèscmd.exe
a commencé, utilisez lelpCurrentDirectory
paramètre deCreateProcess
de le faire. Vous aurez également besoin de passer le/C
option pourcmd.exe
à faire fermer une fois que la commande est terminée.Si vous avez besoin de changer
input
à ceci:- Je utiliser
GetEnvironmentVariable('COMSPEC')
comme un moyen d'obtenir le chemin d'accès à la commande de l'interpréteur.Et ensuite appeler
CreateProcess
comme ceci:Il est sémantiquement nettoyant à utiliser
or
de combiner les drapeaux que+
, mais il a le même effet pour ces indicateurs.Une chose à surveiller est que le deuxième paramètre doit point à l'écriture de la mémoire. C'est parce que
CreateProcess
peut modifier ce paramètre. Comme il arrive, votre mise deinput
satisfait à cette exigence. Dans tous les cas, un appel àUniqueString
serait recommandé, à mon avis, pour le rendre plus explicite le fait que vous êtes de satisfaire à cette exigence.L'autre chose que je vois qui manque, c'est le code pour fermer les poignées qui sont retournés par
CreateProcess
. Fermer ces poignées en faisant cela, en fin de compte:C'est une mauvaise idée d'utiliser le premier paramètre de la fonction CreateProcess! Vous devez les mettre tous dans le deuxième paramètre afin d'avoir un "valide" argument de ligne de commande pour le processus a commencé. Voir la documentation de
CreateProcess
...OK, c'est fait.
Le cas particulier de l'exécution du lot auge cmd.exe la documentation suggère d'utiliser le premier paramètre avec cmd.exe. "Pour exécuter un fichier de commandes, vous devez démarrer l'interpréteur de commande; ensemble lpApplicationName à cmd.exe et ensemble lpCommandLine les arguments suivants: /c plus le nom du fichier de commandes." (goo.gl/9y0gw)
OriginalL'auteur David Heffernan