OVH Cloud OVH Cloud

Exécuter une commande DOS, rajouter une option dans le clique droit

18 réponses
Avatar
Guillaume
Bonjour à tous

Voilà, je me met au C# alor que je n'ais jamais dévellopé qu'en PHP, donc
j'ai un peut du mal

En fait, je galaire surtout sur 2 truc :

Premièrement, j'aimerais intaragire avec un programme en ligne de commande,
pour pouvoire faire une interface utilisateur. Donc, passer des commandes,
puis récupérer le résultat pour savoir comment réagire.

A savoir que quand le programme en question est lancé, on ne revien pas
forcément à l'invite c:\>, mais que j'ai quand meme besoin de continuer à
passer des commandes au pragramme quand il l'attend

Deuxièmement, j'aimerais pouvoire rajouter une option dans le menu clique
droit de Windows lorsque on le fait sur un fichier (comme le font par
exemple les logiciel de compression/decompression), mais je n'arrive pas à
trouver comment faire...

Merci d'avance pour votre aide

8 réponses

1 2
Avatar
Guillaume
"Gloops" a écrit dans le message de

Bonjour,

Si on redirige l'entrée, l'application est effectivement susceptible de
sortir du contrôle de l'utilisateur, si le flux d'entrée ne contient pas ce
qu'il faut jusqu'à la fermeture de l'application.

Mais à propos, je ne suis pas bien sûr d'avoir vu où est défini
StandardInput ; ça fait que je ne suis pas très à l'aise pour regarder ce
qu'il y a dedans, si tant est que c'est défini dans ton message.



Merci pour cette précision qui m'a permit de résoudre mon probleme : j'ai
remplacé tout les
WaitForExit();
par des
WaitForExit(1000);
ce qui fait que je reprend la main, et je récupère le résultat !

Merci beaucoup pour votre aide à tous !
Avatar
Guillaume
>
Merci beaucoup pour votre aide à tous !




Bon, en fait, à peine je considère que ça marche que je me retrouve face à
un GROS probleme :
Si je veux pouvoire lire le résultat de standartOutput, je suis obligé de
fermer le process avant...

Ce qui fait que pour une communication interactive c'est plutot compromis !

Dans mon idé, j'aurais voulu faire un truc comme ça :

Je lance CMD
J'envoi echo coucou
Je regarde si coucou s'est bien affiché
Je lance echo coucou 2
Je regarde si coucou 2 s'est bien affiché

Mais ça, y'a pas moyen, car pour lire le résultat de echo coucou, je suis
obligé de fermer CMD, donc, si je veux par la suite envoyer echo coucou 2,
je suis obligé de relancer CMD...

Bref, si quelqu'un as une idée...

Merci d'avance !
Avatar
Gilles Kohl [MVP]
On Sun, 27 Apr 2008 18:43:18 +0200, "Guillaume" wrote:

Bonjour, et merci pour ces informations.
Bon, comme je le disait, je suis vraiment débutant en C#, donc je galaire
vraiment...

Mais j'ai essayer de me dépatouiller avec la doc grace à vous infos, et j'ai
pondu un code qui me semble correcte.
Cepandant, pour un raison qui m'échappe totalement, la ligne ou je set le
standardInput à true fait completement planter l'apli quand je la test, et
je suis obligé de killer le process pour pouvoire retourner à l'IDE...



Voici un example de cmd.exe "télécommandé" qui fonctionne aussi
longtemps que vous pouvez vous limiter à la ligne de texte comme unité
d'entrée/sortie.

Créez une nouvelle application WinForm, avec un formulaire "Form1",
une textbox que vous appelez "textBoxCommand" et une autre
"textBoxOutput". La proprieté "multiline" de celle-ci doit etre à
"true". Ajoutez un bouton "buttonExec".

Positionnez textBoxCommand en haut de Form1, buttonExec a coté, le
reste de la place étant pris par "textBoxOutput".

(Ajoutez de l'anchoring a votre gout)

Clickez double sur Form1 pour créer une méthode vide Form1_Load. De
meme pour buttonExec. Vous finirez - sous VS2005 - plus ou moins avec
ceci:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

}

private void buttonExec_Click(object sender, EventArgs e)
{

}
}
}

Remplacez - en bloc - par ceci:

using System;
using System.Windows.Forms;
using System.Diagnostics;

namespace WindowsApplication1
{
public partial class Form1 : Form
{
Process m_Command;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
ProcessStartInfo startInfo = new ProcessStartInfo("cmd.exe",
"ver");

startInfo.RedirectStandardError = true;
startInfo.RedirectStandardInput = true;
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;

m_Command = Process.Start(startInfo);
m_Command.ErrorDataReceived += new
DataReceivedEventHandler(m_Command_DataReceived);
m_Command.OutputDataReceived += new
DataReceivedEventHandler(m_Command_DataReceived);
m_Command.BeginErrorReadLine();
m_Command.BeginOutputReadLine();
}

void m_Command_DataReceived(object sender, DataReceivedEventArgs
e)
{
if(this.InvokeRequired)
{
try
{
this.Invoke(new
DataReceivedEventHandler(m_Command_DataReceived), sender, e);
}
catch(ObjectDisposedException) { }

return;
}
textBoxOutput.AppendText(e.Data + Environment.NewLine);
textBoxCommand.Focus();
}

private void buttonExec_Click(object sender, EventArgs e)
{
if(textBoxCommand.Text.Equals("cls",
StringComparison.InvariantCultureIgnoreCase))
{
textBoxOutput.Clear();
}
else
{
m_Command.StandardInput.Write(textBoxCommand.Text + "n");
}
textBoxCommand.Text = "";
}

}
}

Cela lancera CMD.EXE sans fenetre, et fera executer la commande
"VERsion", en captant la sortie. Ensuite, entrez une commande dans
textBoxCommand, par example "DIR", et cliquez sur "buttonExec".

Amicalement,
Gilles.

Regards,
Gilles [MVP].

(Please reply to the group, not via email.
Find my MVP profile with past articles / downloads here:
http://www.gilleskohl.de/mvpprofile.htm)
Avatar
Gilles Kohl [MVP]
On Mon, 28 Apr 2008 09:24:26 +0200, "Guillaume" wrote:


Merci beaucoup pour votre aide à tous !




Bon, en fait, à peine je considère que ça marche que je me retrouve face à
un GROS probleme :
Si je veux pouvoire lire le résultat de standartOutput, je suis obligé de
fermer le process avant...

Ce qui fait que pour une communication interactive c'est plutot compromis !

Dans mon idé, j'aurais voulu faire un truc comme ça :

Je lance CMD
J'envoi echo coucou
Je regarde si coucou s'est bien affiché
Je lance echo coucou 2
Je regarde si coucou 2 s'est bien affiché

Mais ça, y'a pas moyen, car pour lire le résultat de echo coucou, je suis
obligé de fermer CMD, donc, si je veux par la suite envoyer echo coucou 2,
je suis obligé de relancer CMD...

Bref, si quelqu'un as une idée...

Merci d'avance !



Cf. l'exemple que je viens de poster, j'espère que ca marchera de
cette facon.

Amicalement,
Gilles.



Regards,
Gilles [MVP].

(Please reply to the group, not via email.
Find my MVP profile with past articles / downloads here:
http://www.gilleskohl.de/mvpprofile.htm)
Avatar
Gloops
Guillaume a écrit, le 28/04/2008 09:12 :
"Gloops" a écrit dans le message de

Bonjour,

Si on redirige l'entrée, l'application est effectivement susceptible
de sortir du contrôle de l'utilisateur, si le flux d'entrée ne
contient pas ce qu'il faut jusqu'à la fermeture de l'application.

Mais à propos, je ne suis pas bien sûr d'avoir vu où est défin i
StandardInput ; ça fait que je ne suis pas très à l'aise pour re garder
ce qu'il y a dedans, si tant est que c'est défini dans ton message.



Merci pour cette précision qui m'a permit de résoudre mon probleme :
j'ai remplacé tout les
WaitForExit();
par des
WaitForExit(1000);
ce qui fait que je reprend la main, et je récupère le résultat !



Suffisait d'y penser :)
évidemment, encore s'agit-il de laisser suffisamment de temps au
programme CMD pour fournir sa sortie.



A propos, au départ ce serait bien de définir ce qu'il y a à faire. Si
ça se trouve, conserver le programme en ligne de commandes n'est
peut-être pas la meilleure solution ?
Avatar
Guillaume
> Cf. l'exemple que je viens de poster, j'espère que ca marchera de
cette facon.

Amicalement,
Gilles.




Merci beaucoup pour votre aide, celà semble parfaitement correspondre à ce
que je cherche à faire.

Je me penche dessus des que j'ai un istant, et vous tien au courrant du
résultat.

Quoi qu'il en soit, merci beaucoup de m'aider comme vous le faite !

Cordialement
Avatar
Guillaume
>A propos, au départ ce serait bien de définir ce qu'il y a à faire. Si ça
se trouve, conserver le programme en ligne de commandes n'est peut-être pas
la meilleure solution ?



Je ne comprend pas bien le sens de votre question...

Ce que je cherche à faire, c'est de créer des GUI pour des logiciels en
ligne de commande, comme photorec ou GPG

Alors oui, je sais, il existe déjà WinPT pour GPG, et peut etre existe t il
déjà quelquechose pour photorec, mais je voudrais savoir faire ça, c'est
tout...

Je cherche à apprendre le C#, et il faut bien commencer par quelque chose.
Comme se genre d'application m'interresse, je commence par là, voilà tout ^^

En tout cas, merci pour toute l'aide qui m'est apporté dans cette démarche
sur ce newsgroup !

Cordialement
Avatar
Gloops
Guillaume a écrit, le 30/04/2008 19:30 :
Alors oui, je sais, il existe déjà WinPT pour GPG, et peut etre exi ste t
il déjà quelquechose pour photorec, mais je voudrais savoir faire ç a,
c'est tout...




Effectivement, vu comme ça, c'est bien la bonne piste :)
1 2