2010-07-22 17 views
10

Mogę uruchomić proces wiersza poleceń za pomocą process.start(). Mogę zapewnić wejście przy użyciu standardowego wejścia. Następnie, kiedy proces wymaga ponownego wprowadzenia danych przez użytkownika, w jaki sposób mój program może poznać i przekazać dane wejściowe do tego exe?Uruchom interaktywną linię poleceń exe, używając C#

+0

Możesz być zainteresowany [ten post] (http://www.codeducky.org/process-handling-net) obejmujący wiele zawiłości pracy z. Procesów NET, szczególnie w zakresie pracy z wejściem i wyjściem – ChaseMedallion

Odpowiedz

10

Jest takie example here, które brzmi podobnie do tego, co trzeba, używając Process.StandardInput i StreamWriter .

 Process sortProcess; 
     sortProcess = new Process(); 
     sortProcess.StartInfo.FileName = "Sort.exe"; 

     // Set UseShellExecute to false for redirection. 
     sortProcess.StartInfo.UseShellExecute = false; 

     // Redirect the standard output of the sort command. 
     // This stream is read asynchronously using an event handler. 
     sortProcess.StartInfo.RedirectStandardOutput = true; 
     sortOutput = new StringBuilder(""); 

     // Set our event handler to asynchronously read the sort output. 
     sortProcess.OutputDataReceived += new DataReceivedEventHandler(SortOutputHandler); 

     // Redirect standard input as well. This stream 
     // is used synchronously. 
     sortProcess.StartInfo.RedirectStandardInput = true; 
     sortProcess.Start(); 

     // Use a stream writer to synchronously write the sort input. 
     StreamWriter sortStreamWriter = sortProcess.StandardInput; 

     // Start the asynchronous read of the sort output stream. 
     sortProcess.BeginOutputReadLine(); 
     Console.WriteLine("Ready to sort up to 50 lines of text"); 
     String inputText; 
     int numInputLines = 0; 
     do 
     { 
      Console.WriteLine("Enter a text line (or press the Enter key to stop):"); 

      inputText = Console.ReadLine(); 
      if (!String.IsNullOrEmpty(inputText)) 
      { 
       numInputLines ++; 
       sortStreamWriter.WriteLine(inputText); 
      } 
     } 

nadzieję, że pomoże

+0

dzięki jeszcze raz. ale jest to specyficzne dla sort.exe i m generowania exe w czasie wykonywania dla każdego użytkownika. Nie wiem, jaki program napisze. – rajshades

+0

Myślę, że możesz użyć "cmd.exe" zamiast wybranego pliku wykonywalnego. To jest hack, ale może to zrobić zadanie –

+0

Drogi robert można wyjaśnić, jak używać cmd.exe dla mojego problemu – rajshades

2

Jeśli dobrze rozumiem, myślę, że powinieneś być w stanie to zrobić, przekierowując standardowe wejście/wyjście przy użyciu RedirectStandardOutput i RedirectStandardInput.

Projekt WinSCP ma próbkę C#, która umożliwia komunikację z nią w ten sposób. Można go znaleźć tutaj: SFTP file transfers in .NET (choć ta próbka zbiera tylko wyjście bez użycia go w ogóle, ale technika powinna być taka sama.)

+0

dzięki za odpowiedź ur. próbowałem tego. ale proces wymagający wprowadzenia użytkownika nie jest wstępnie zdefiniowany. scenariusz jest jak 1. Chcę zaprojektować online kompilator dla C# 2. mogę zbudować program przy użyciu kodu dom n cretae exe 3. teraz chcę uruchomić ten exe poprzez C# 4. użytkownik może napisać dowolny typ program, który potrzebuje danych wprowadzanych przez użytkownika na etapie diff. Mam nadzieję, że zrozumiałeś cały scenariusz – rajshades

+0

@ranshades: Myślałem, że to będzie podobne, ale zamiast wysyłać wszystkie polecenia za jednym razem, możesz wysłać komendę, odczytać wynik, wysłać następne polecenie itp. Chociaż tego nie testowałem. Generalnie jednak, jeśli tworzysz exe, czy nie możesz spróbować dać mu lepszego sposobu komunikowania się z nim (WCF, sockects TCP/IP, nazwy potoków itp.)? –

1

Chcesz zajrzeć do IPC. Jak pokazał Robert, klasa Process w .NET pomoże. Ale specjalnie dla twojego problemu (jak wiedzieć, kiedy pisać dane): Nie możesz. Nie generycznie.

Jeśli znasz wymagane dane wejściowe (np. "Yyy"), możesz je podać w utworzonym procesie. Nie musisz czekać, aż program zażąda tych informacji: po prostu odczyta z STDIN, kiedy chce danych.

Jeśli chcesz przetworzyć wyniki programów, aby zdecydować, co napisać, na STDIN, spróbuj odczytać procesy STDOUT. Możesz napotkać problemy z opróżnianiem, ale ...

Powiązane problemy