Comment puis-je rediriger la sortie vers un fichier avec CreateProcess?
J'ai essayé d'utiliser la fonction CreateProcess pour exécuter une commande simple comme hg > test.txt
. J'ai essayé de lancer la chaîne dans son ensemble (par opposition à séparer dans le nom d'une application et de ses paramètres). Pourquoi ne CreateProcess(0, "notepad.exe test.txt", ...)
travail mais CreateProcess(0, "hg > test.txt", ...)
ne l'est pas?
CreateProcess
ne connaît pas les redirections. Pourquoi n'utilisez-vous passystem(3)
? Laissez-moi deviner: vous pouvez faire mieux que le système(3).- Je me suis toujours demandé ce que le
function(number)
notation signifiait. Ce n'system(3)
veux dire? - Carnegie La section du manuel.
man 3 system
. man 3 system
pour Windows??- il peut certainement faire mieux que le système (sous Windows). Système de lancement cmd.exe et de charger tous les types de dépendances et de provoquer toutes sortes de choses inutiles à arriver.
- En fait,
CreateProcess()
a unelpStartupInfo
structure qui prend des poignées pour la redirection de flux, si elle ne sait sur les redirections. Il n'a tout simplement pas utiliser le shell de notation. - c'est à partir d'Unix, vous tapez man 3 système et cela signifie rechercher de la documentation du système dans la section 3 du manuel pages (Api, intégré dans les commandes, etc)
- André Caron d'Accord 🙂 je ne sais pas si ça vaut le coup dans ce cas, mais je vais garder cela à l'esprit.
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas utiliser la redirection de la sortie standard dans la ligne de commande passée
CreateProcess
. Pour rediriger la sortie standard (stdout), vous devez spécifier un descripteur de fichier pour la sortie dans leSTARTUPINFO
structure.Vous sont également de faire un autre, plus subtile, d'une erreur. Le deuxième paramètre,
lpCommandLine
doit pointer vers écriture de la mémoire carCreateProcess
remplace le tampon. Si vous arrive d'être en utilisant la version ANSI de la fonction, vous vous en sortirez avec cela, mais pas pour la version Unicode.CreateProcess
fonction modifier son entrée en ligne de commande?UNICODE
défini, auquel casCreateProcess
estCreateProcessA
, qui n'ont pas cette exigence.LPTSTR
. En tout cas, j'ai fait le point que vous faites dans mon deuxième paragraphe.Le code ci-dessous crée une console-moins de processus avec stdout et stderr redirigé vers le fichier spécifié.
Microsoft a un exemple comment rediriger la sortie standard:
http://msdn.microsoft.com/en-us/library/ms682499(SV.85).aspx.
ReadFromPipe
de sortie. Avant d'appeler cette fonction, vous devez appeler:CloseHandle(g_hChildStd_OUT_Wr);
. Aussi, vous aurez probablement envie d'attendre pour le processus de l'enfant à la sortie avant de fermer le handle de processus avec quelque chose comme:WaitForSingleObject(piProcInfo.hProcess, INFINITE);
.CreateProcess() lance le processus, il n'est pas une ligne de commande itnerpreter. Il ne sait pas ce que ">" est et de ne pas faire de la redirection de flux pour vous. Vous devez ouvrir le fichier test.txt vous-même et passer la poignée à la fonction CreateProcess à l'intérieur de la structure STARTUPINFO:
CreateProcess
STARTUPINFO
vous devez exécuter le processus de cmd.exe avec params "/c de la ligne de commande".
Cela permettra de rediriger la sortie vers un fichier ou d'organiser un gazoduc à travers la fonction CreateProcess.