Question

C'est mon problème. J'ai un programme qui doit fonctionner dans un téléscripteur, cygwin fournit ce téléscripteur. Lorsque je redirige stdIn, le programme échoue car il n’a pas de téléscripteur. Je ne peux pas modifier ce programme et j'ai besoin d'un moyen de l'automatiser.

Comment puis-je saisir la fenêtre cmd.exe et lui envoyer des données et lui faire croire que l'utilisateur la tape?

J'utilise C #, je pense qu'il existe un moyen de le faire avec java.awt.Robot mais je dois utiliser C # pour d'autres raisons.

Était-ce utile?

La solution

Cela ressemble à une tâche pour SendKeys () . Ce n'est pas du C #, mais du VBScript, mais non des moindres - vous avez demandé un moyen d'automatiser le tout:

Set Shell = CreateObject("WScript.Shell")

Shell.Run "cmd.exe /k title RemoteControlShell"
WScript.Sleep 250

Shell.AppActivate "RemoteControlShell"
WScript.Sleep 250

Shell.SendKeys "dir{ENTER}"

Autres conseils

J'ai compris comment envoyer l'entrée vers la console. J'ai utilisé ce que Jon Skeet a dit. Je ne suis pas sûr à 100% que ce soit la bonne façon de mettre en œuvre cela.

S'il y a des commentaires à faire pour améliorer cela, j'aimerais beaucoup ici. Je l'ai fait juste pour voir si je pouvais le comprendre.

Voici le programme que j'ai vu qui attendait l'entrée de l'utilisateur

class Program
{
    static void Main(string[] args)
    {
        // This is needed to wait for the other process to wire up.
        System.Threading.Thread.Sleep(2000);

        Console.WriteLine("Enter Pharse: ");

        string pharse = Console.ReadLine();

        Console.WriteLine("The password is '{0}'", pharse);


        Console.WriteLine("Press any key to exit. . .");
        string lastLine = Console.ReadLine();

        Console.WriteLine("Last Line is: '{0}'", lastLine);
    }
}

Ceci est l'application de la console qui écrit sur l'autre

class Program
{
    static void Main(string[] args)
    {
        // Find the path of the Console to start
        string readFilePath = System.IO.Path.GetFullPath(@"..\..\..\ReadingConsole\bin\Debug\ReadingConsole.exe");

        ProcessStartInfo startInfo = new ProcessStartInfo(readFilePath);

        startInfo.RedirectStandardOutput = true;
        startInfo.RedirectStandardInput = true;
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;
        startInfo.CreateNoWindow = true;
        startInfo.UseShellExecute = false;

        Process readProcess = new Process();
        readProcess.StartInfo = startInfo;

        // This is the key to send data to the server that I found
        readProcess.OutputDataReceived += new DataReceivedEventHandler(readProcess_OutputDataReceived);

        // Start the process
        readProcess.Start();

        readProcess.BeginOutputReadLine();

        // Wait for other process to spin up
        System.Threading.Thread.Sleep(5000);

        // Send Hello World
        readProcess.StandardInput.WriteLine("Hello World");

        readProcess.StandardInput.WriteLine("Exit");

        readProcess.WaitForExit();
    }

    static void readProcess_OutputDataReceived(object sender, DataReceivedEventArgs e)
    {
        // Write what was sent in the event
        Console.WriteLine("Data Recieved at {1}: {0}", e.Data, DateTime.UtcNow.Ticks);
    }
}

Pouvez-vous lancer le programme (ou cygwin) dans votre code en utilisant ProcessStartInfo.RedirectStandardInput (et sortie / erreur) pour contrôler le flux de données?

J'ai eu un problème similaire il y a quelque temps, cygwin devrait écrire quelques informations utiles (fonction cygwin exacte, texte de l'erreur et code d'erreur WINAPI) dans le flux d'erreur, vous devez le rediriger quelque part et lire ce qu'il écrit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top