7

これは私の問題です。TTY で実行する必要があるプログラムがあります。cygwin はこの TTY を提供します。stdIn をリダイレクトすると、TTY がないためプログラムが失敗します。このプログラムを変更することはできず、自動化する方法が必要です。

cmd.exe ウィンドウを取得してデータを送信し、ユーザーが入力していると認識させるにはどうすればよいですか?

私は C# を使用しています。java.awt.Robot でそれを行う方法があると思いますが、他の理由で C# を使用する必要があります。

4

4 に答える 4

5

入力をコンソールに送信する方法を理解しました。私はジョン・スキートが言ったことを使いました。これがこれを実装する正しい方法であると100%確信しているわけではありません。

これを改善するためのコメントがあれば、ここに書きたいと思います。私はそれを理解できるかどうかを確認するためにこれを行いました。

これは、ユーザーからの入力を待っていたプログラムです。

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);
    }
}

これは、もう一方に書き込むコンソール アプリです。

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);
    }
}
于 2009-01-16T21:00:45.213 に答える
1

これは のタスクのように聞こえますSendKeys()。それは C# ではなく VBScript ですが、それにもかかわらず - あなたはそれを自動化する方法を求めました:

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}"
于 2009-01-16T17:35:10.590 に答える
1

ProcessStartInfo.RedirectStandardInputデータフローを制御するために (および出力/エラー) を使用して、コード内でプログラム (または cygwin) を開始できますか?

于 2009-01-16T17:14:21.363 に答える
0

少し前に同様の問題がありました.cygwinはいくつかの有用な情報(正確なcygwin関数、エラーテキスト、およびWINAPIエラーコード)をエラーストリームに書き込む必要があります。それをどこかにリダイレクトして、書き込まれたものを読む必要があります。

于 2009-01-16T17:46:19.833 に答える