別の質問で説明されている問題がいくつか発生した後Windowsコマンドプロンプトをシミュレートするアプリケーションを作成しました。すべてのコマンドは、 "CMD.exe/C [command]"を呼び出し、その標準出力/エラーをWinformにリダイレクトするProcessオブジェクトによって実行されます。プロセスは入力を待つコマンドでハングし、RedirectStandardInputは 'true'です
うまくいくが、ユーザーインタラクション(RedirectStandardInputがTRUE)を求める「時間」や「wmic」などの特定のコマンドを実行すると、フォームがクラッシュする。どのように私はこれを解決することができます(古典的なプロンプトのような)入力を待つカーソルを作る?
この
は、私は例えば、入力リダイレクトと今の出力を可能にするすべての部分をコメントしたコード Process cmdProcess = new Process();
cmdProcess.StartInfo.FileName = "CMD.exe";
cmdProcess.StartInfo.Arguments = "/C " + command;
cmdProcess.StartInfo.WorkingDirectory = this.workingDir;
cmdProcess.StartInfo.CreateNoWindow = true;
cmdProcess.StartInfo.UseShellExecute = false;
cmdProcess.StartInfo.RedirectStandardOutput = true;
cmdProcess.StartInfo.StandardOutputEncoding = Encoding.Default;
cmdProcess.StartInfo.RedirectStandardError = true;
cmdProcess.StartInfo.StandardErrorEncoding = Encoding.Default;
//cmdProcess.StartInfo.RedirectStandardInput = true;
cmdProcess.Start();
StreamReader outputR = cmdProcess.StandardOutput;
StreamReader errorR = cmdProcess.StandardError;
//StreamWriter inputW = cmdProcess.StandardInput;
string output = outputR.ReadToEnd();
string error = errorR.ReadToEnd();
if (output.Length > 0)
this.textArea.AppendText(Environment.NewLine + output);
else if (error.Length > 0)
this.textArea.AppendErrorText(Environment.NewLine + error);
で、「時間」コマンドでは、すべてのユーザー入力を尋ねるとすぐに返していません。もちろん、私はこの振る舞いを好きではない;)
C:\Users\Alessandro\Progetti\CMDProject\CMDProject\bin\Debug>time
Ora corrente: 19:32:17,55
Immettere nuova ora:
C:\Users\Alessandro\Progetti\CMDProject\CMDProject\bin\Debug>
お電話の際/ WMICは、あなたがこのsychronousをやりたいと思っていますまたは非同期。?あなたがおそらくしようとしているもののSystem.Diagnostics.Processを適切に使用する方法に関する他の参考文献を持っているこのリンクをチェックしてください.. http://stackoverflow.com/questions/7502894/wmic-mangementclass-remotecommand-determining-when-それは終わった - stdout – MethodMan