2017-02-01 6 views
0

process.StandardInput.WriteLine(コマンド)を使用している問題があります。 私はC#でCMDをシミュレートするプログラムを作成しようとしているので、いくつかのコマンドを入力してプロセスを閉じることなく "cd"を使ってフォルダをナビゲートすることができます(別のプロセスデフォルトの場所から開始されたためです)。最初のコマンドはうまくいきますが、もう1つコマンドを入力したい場合は、コマンドがハングします。 StandardInput()を閉じているからだと思います。私が間違っていることに関する提案はありますか?C#プロセスの問題は、readlineを使用してcmdでナビゲートする

 Process cmd = new Process(); 
     cmd.StartInfo.FileName = "cmd.exe"; 
     cmd.StartInfo.RedirectStandardInput = true; 
     cmd.StartInfo.RedirectStandardOutput = true; 
     cmd.StartInfo.CreateNoWindow = true; 
     cmd.StartInfo.UseShellExecute = false; 
     cmd.Start(); 
     while (true) 
     { 
      string command = Console.ReadLine(); 
      cmd.StandardInput.WriteLine(command); 
      cmd.StandardInput.Flush(); 
      cmd.StandardInput.Close(); 
      cmd.WaitForExit(); 
      Console.WriteLine(cmd.StandardOutput.ReadToEnd()); 

     } 

Photo of the error

+0

どのようにコマンドを入力していますか? Console.ReadLine()による –

+0

; C#のコンソール – suffuko

+0

あなたは正しいです。 CloseとExitはwhileループ内にあってはなりません。 – jdweng

答えて

0

あなたは除外しようとするので、この問題のために良い解決策を見つけるために少しトリッキーです:

cmd.StandardInput.Close(); 
cmd.WaitForExit(); 

をあなたはReadToEndは、()を返すことはありませんことを確認します文字列、私はこれがcmd.StandardOutput.BaseStreamのストリームの位置を提供する不自由と関係していると思います。有効なコマンドではありませんこれは、うまくいけばユニーク ENDコードが送信され、各コマンドの後

Process cmd = new Process(); 
cmd.StartInfo.FileName = "cmd.exe"; 
cmd.StartInfo.RedirectStandardInput = true; 
cmd.StartInfo.RedirectStandardOutput = true; 
cmd.StartInfo.CreateNoWindow = true; 
cmd.StartInfo.UseShellExecute = false; 
cmd.Start(); 
string END = "E-N-D"; 
while (true) 
{ 
    string command = Console.ReadLine(); 
    cmd.StandardInput.WriteLine(command); 
    cmd.StandardInput.WriteLine(END); 
    cmd.StandardInput.Flush(); 

    string oldLine = ""; 
    string newLine = ""; 
    bool endOfOutput = false; 
    bool oldLineIsEmpty = true; 
    do 
    { 
     newLine = cmd.StandardOutput.ReadLine(); 
     if (newLine.Contains(END)) 
     { 
      endOfOutput = true; 
     } 
     else if (!oldLineIsEmpty) 
     { 
      Console.WriteLine(oldLine); 
     } 
     oldLine = newLine; 
     oldLineIsEmpty = false; 
    } while(!endOfOutput); 
} 
cmd.WaitForExit(); 
cmd.StandardInput.Close(); 

が、最後のスポッティングための良い方法:

だから私の回避策はこれですそれはそこにも現れているからです。

OldLineは、最初のコマンドの後に改行がコンソールに書き込まれないようにするためのバッファーとして使用されます。

+0

ありがとうございました!それは魅力のように働く。私は頭を壊して解決策を探して、ほぼ2日間過ごしました。 "cd"コマンドでも動作します:D – suffuko

+0

私はあなたに満足しています:) –

関連する問題