Comment exécuter un programme de ligne de commande à partir de C # et récupérer les résultats STD OUT? Plus précisément, je veux exécuter DIFF sur deux fichiers sélectionnés par programme et écrire les résultats dans une zone de texte.
c#
command-line
Aile
la source
la source
Réponses:
Le code provient de MSDN .
la source
{YourProcessObject}.StartInfo.Arguments
chaîne.p.StandardError
flux. Lorsque le flux est plein, il semble que le processus s'arrête jusqu'à ce que les données soient consommées, je dois donc lire les deuxStandardError
etStandardOutput
afin de garantir qu'une tâche s'exécute correctement.Voici un petit échantillon:
la source
Il y a un autre paramètre que j'ai trouvé utile, que j'utilise pour éliminer la fenêtre de processus
cela aide à cacher complètement la fenêtre de console noire à l'utilisateur, si c'est ce que vous désirez.
la source
la source
process.StartInfo.RedirectStandardError = true;
etif (process.ExitCode == 0)
quelle réponse acceptée n'a pas.La réponse acceptée sur cette page présente une faiblesse gênante dans de rares situations. Il existe deux descripteurs de fichiers sur lesquels les programmes écrivent par convention, stdout et stderr. Si vous venez de lire un seul descripteur de fichier tel que la réponse de Ray, et que le programme que vous démarrez écrit suffisamment de sortie dans stderr, il remplira le tampon et le bloc de sortie stderr. Vos deux processus sont alors bloqués. La taille du tampon peut être 4K. C'est extrêmement rare sur les programmes de courte durée, mais si vous avez un programme de longue durée qui sort à plusieurs reprises sur stderr, cela se produira éventuellement. C'est difficile à déboguer et à retrouver.
Il y a quelques bonnes façons de gérer cela.
Une façon consiste à exécuter cmd.exe au lieu de votre programme et à utiliser l'argument / c à cmd.exe pour appeler votre programme avec l'argument "2> & 1" à cmd.exe pour lui dire de fusionner stdout et stderr.
Une autre façon consiste à utiliser un modèle de programmation qui lit les deux poignées en même temps.
la source
la source
Vous devrez utiliser
ProcessStartInfo
avecRedirectStandardOutput
activé - alors vous pouvez lire le flux de sortie. Vous trouverez peut-être plus facile d'utiliser ">" pour rediriger la sortie vers un fichier (via le système d'exploitation), puis de simplement lire le fichier.[modifier: comme ce que Ray a fait: +1]
la source
RedirectStandardOutput
fait.Si cela ne vous dérange pas d'introduire une dépendance, CliWrap peut simplifier cela pour vous:
la source
Ce n'est peut-être pas le meilleur moyen / le plus simple, mais cela peut être une option:
Lorsque vous exécutez à partir de votre code, ajoutez "> output.txt", puis lisez le fichier output.txt.
la source
Vous pouvez lancer n'importe quel programme de ligne de commande à l'aide de la classe Process et définir la propriété StandardOutput de l'instance Process avec un lecteur de flux que vous créez (en fonction d'une chaîne ou d'un emplacement mémoire). Une fois le processus terminé, vous pouvez alors faire tout ce dont vous avez besoin sur ce flux.
la source
Cela peut être utile pour quelqu'un si vous essayez d'interroger le cache ARP local sur un PC / serveur.
la source
Commande d'exécution sur une ligne:
Lire la sortie de la commande dans la plus petite quantité de code disponible:
la source
Il existe une classe ProcessHelper dans le code open source PublicDomain qui pourrait vous intéresser.
la source
Si vous devez également exécuter une commande dans cmd.exe, vous pouvez effectuer les opérations suivantes:
Cela renvoie uniquement la sortie de la commande elle-même:
Vous pouvez également utiliser à la
StandardInput
place deStartInfo.Arguments
:Le résultat ressemble à ceci:
la source
Juste pour le plaisir, voici ma solution complète pour obtenir une sortie PYTHON - sous un clic de bouton - avec un rapport d'erreur. Ajoutez simplement un bouton appelé "butPython" et une étiquette appelée "llHello" ...
la source
Étant donné que la plupart des réponses ici
using
n'implémentent pas le statemant pourIDisposable
et d'autres choses qui, je pense, pourraient être nécessaires, j'ajouterai cette réponse.Pour C # 8.0
la source