open System
open System.Diagnostics
let runProc filename args startDir : seq<string> * seq<string> =
let timer = Stopwatch.StartNew()
let procStartInfo =
ProcessStartInfo(
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
FileName = filename,
Arguments = args
match startDir with | Some d -> procStartInfo.WorkingDirectory <- d | _ -> ()
let outputs = System.Collections.Generic.List<string>()
let errors = System.Collections.Generic.List<string>()
let outputHandler f (_sender:obj) (args:DataReceivedEventArgs) = f args.Data
use p = new Process(StartInfo = procStartInfo)
p.OutputDataReceived.AddHandler(DataReceivedEventHandler (outputHandler outputs.Add))
p.ErrorDataReceived.AddHandler(DataReceivedEventHandler (outputHandler errors.Add))
let started =
p.Start()
with | ex ->
ex.Data.Add("filename", filename)
reraise()
if not started then
failwithf "Failed to start process %s" filename
printfn "Started %s with pid %i" p.ProcessName p.Id
p.BeginOutputReadLine()
p.BeginErrorReadLine()
p.WaitForExit()
timer.Stop()
printfn "Finished %s after %A milliseconds" filename timer.ElapsedMilliseconds
let cleanOut l = l |> Seq.filter (fun o -> String.IsNullOrEmpty o |> not)
cleanOut outputs,cleanOut errors
Le code de la
runProc
fonction a été écrit par
ImaginaryDevelopment
et est disponible sous licence
publique Microsoft
.
Un
Process
composant permet d’accéder à un processus en cours d’exécution sur un ordinateur. Un processus, en termes les plus simples, est une application en cours d’exécution. Un thread est l’unité de base à laquelle le système d’exploitation alloue du temps processeur. Un thread peut exécuter n’importe quelle partie du code du processus, y compris les parties en cours d’exécution par un autre thread.
Le
Process
composant est un outil utile pour démarrer, arrêter, contrôler et surveiller des applications. Vous pouvez utiliser le
Process
composant pour obtenir la liste des processus en cours d’exécution, ou vous pouvez démarrer un nouveau processus. Un
Process
composant est utilisé pour accéder aux processus système. Une fois qu’un
Process
composant a été initialisé, il peut être utilisé pour obtenir des informations sur le processus en cours d’exécution. Ces informations incluent l’ensemble des threads, les modules chargés (fichiers .dll et .exe) et les informations de performances telles que la quantité de mémoire utilisée par le processus.
Ce type implémente l'interface
IDisposable
. Une fois que vous avez fini d’utiliser le type, vous devez le supprimer directement ou indirectement. Pour supprimer directement le type
Dispose
, appelez sa méthode dans un bloc
try
/
finally
. Pour la supprimer indirectement, utilisez une construction de langage telle que
using
(dans C#) ou
Using
(dans Visual Basic). Pour plus d’informations, consultez la section « Utilisation d’un objet qui implémente IDisposable » dans la rubrique de l’interface
IDisposable
.
Important
L’appel de méthodes de cette classe avec des données non approuvées est un risque de sécurité. Appelez les méthodes de cette classe avec des données approuvées uniquement. Pour plus d’informations, consultez
Valider toutes les entrées
.
Notes
Les processus 32 bits ne peuvent pas accéder aux modules d’un processus 64 bits. Si vous essayez d’obtenir des informations sur un processus 64 bits à partir d’un processus 32 bits, vous obtiendrez une
Win32Exception
exception. En revanche, un processus 64 bits peut accéder aux modules d’un processus 32 bits.
Le composant de processus obtient des informations sur un groupe de propriétés à la fois. Une fois que le
Process
composant a obtenu des informations sur un membre d’un groupe, il met en cache les valeurs des autres propriétés de ce groupe et n’obtient pas de nouvelles informations sur les autres membres du groupe tant que vous n’appelez pas la
Refresh
méthode . Par conséquent, il n’est pas garanti qu’une valeur de propriété soit plus récente que le dernier appel à la
Refresh
méthode . Les répartitions de groupe dépendent du système d’exploitation.
Si vous avez une variable de chemin d’accès déclarée dans votre système à l’aide de guillemets, vous devez qualifier entièrement ce chemin lors du démarrage d’un processus trouvé à cet emplacement. Sinon, le système ne trouvera pas le chemin d’accès. Par exemple, si
c:\mypath
n’est pas dans votre chemin d’accès et que vous l’ajoutez entre guillemets :
path = %path%;"c:\mypath"
, vous devez qualifier entièrement tout processus dans
c:\mypath
lors de son démarrage.
Un processus système est identifié de manière unique sur le système par son identificateur de processus. Comme de nombreuses ressources Windows, un processus est également identifié par son handle, qui peut ne pas être unique sur l’ordinateur. Un handle est le terme générique d’un identificateur d’une ressource. Le système d’exploitation conserve le handle de processus, qui est accessible via la
Handle
propriété du
Process
composant, même lorsque le processus s’est arrêté. Ainsi, vous pouvez obtenir les informations administratives du processus, telles que (
ExitCode
généralement zéro pour la réussite ou un code d’erreur différent de zéro) et .
ExitTime
Les poignées étant une ressource extrêmement précieuse, les poignées qui fuient sont plus virulentes que les fuites de mémoire.
Notes
Cette classe contient une demande de lien et une demande d’héritage au niveau de la classe qui s’applique à tous les membres. Une
SecurityException
valeur est levée lorsque l’appelant immédiat ou la classe dérivée n’a pas l’autorisation de confiance totale. Pour plus d’informations sur les demandes de sécurité, consultez
Demandes de lien
.
Notes .NET Core
Dans le .NET Framework, la
Process
classe utilise
Console
par défaut des encodages, qui sont généralement des encodages de page de code, pour les flux d’entrée, de sortie et d’erreur. Par exemple, sur les systèmes dont la culture est l’anglais (États-Unis), la page de codes 437 est l’encodage par défaut de la
Console
classe . Toutefois, .NET Core ne peut rendre disponible qu’un sous-ensemble limité de ces encodages. Si c’est le cas, il utilise
Encoding.UTF8
comme encodage par défaut.
Si un
Process
objet dépend d’encodages de pages de codes spécifiques, vous pouvez toujours les rendre disponibles en procédant comme suit
avant
d’appeler
Process
des méthodes :
Ajoutez une référence à l’assembly System.Text.Encoding.CodePages.dll à votre projet.
Récupérez l’objet
EncodingProvider
à partir de la
CodePagesEncodingProvider.Instance
propriété .
Passez l’objet
EncodingProvider
à la
Encoding.RegisterProvider
méthode pour rendre disponibles les encodages supplémentaires pris en charge par le fournisseur d’encodage.
La
Process
classe utilise alors automatiquement l’encodage système par défaut plutôt que UTF8, à condition que vous ayez inscrit le fournisseur d’encodage avant d’appeler des
Process
méthodes.
Crée un objet contenant toutes les informations appropriées requises pour générer un proxy permettant de communiquer avec un objet distant.
(Hérité de
MarshalByRefObject
)
Obsolète.
Récupère l'objet de service de durée de vie en cours qui contrôle la stratégie de durée de vie de cette instance.
(Hérité de
MarshalByRefObject
)
Obsolète.
Obtient un objet de service de durée de vie pour contrôler la stratégie de durée de vie de cette instance.
(Hérité de
MarshalByRefObject
)
Provoque l’attente du
Process
composant spécifié
timeout
pour que le processus associé entre dans un état inactif.
Cette surcharge s'applique uniquement aux processus dotés d'une interface utilisateur et, donc, d'une boucle de message.