Как отправить ввод на консоль, как если бы пользователь печатал?

Это моя проблема. У меня есть программа, которая должна работать в TTY, cygwin предоставляет этот TTY. Когда я перенаправляю stdIn, программа терпит неудачу, потому что у нее нет TTY. Я не могу изменить эту программу и вам нужен какой-то способ ее автоматизации.

Как я могу захватить окно cmd.exe и отправить его данные и заставить его думать, что пользователь печатает его?

Я использую C #, я считаю, что есть способ сделать это с java.awt.Robot, но я должен использовать C # по другим причинам.

Это похоже на задачу 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}" 

Я понял, как отправить вход на консоль. Я использовал то, что сказал Джон Скит. Я не уверен на 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); } } 

Можете ли вы запустить программу (или cygwin) в своем коде, используя ProcessStartInfo.RedirectStandardInput (и выход / ошибку) для управления streamом данных?

У меня была аналогичная проблема некоторое время назад, cygwin должен написать некоторую полезную информацию (точную функцию cygwin, текст ошибки и код ошибки WINAPI) для streamа ошибок, вам нужно перенаправить его где-нибудь и прочитать, что он пишет.

  • Безглавой браузер для C # (.NET)?
  • автоматически выполнять макрос Excel при смене ячейки
  • Сохраненная процедура, которая автоматически удаляет строки старше 7 дней в MYSQL
  • PDF-документы для склейки (наложения)
  • Каковы наилучшие способы автоматизации сеанса отладки GDB?
  • Давайте будем гением компьютера.