Перенаправленный вывод не отображается в текстовом поле - PullRequest
0 голосов
/ 07 июня 2019

Я новичок в визуальной студии. Я хочу написать приложение Windows Form, которое открывает «cmd.exe», и пользователь может ввести команду в текстовом поле. Выходное сообщение из cmd должно быть перенаправлено в другое текстовое поле. По какой-то причине выходное сообщение не отображается в текстовом поле

Я пытался найти ответы, и ни один из них, похоже, не работает для меня. Очень признателен, если кто-то может помочь мне определить проблему

        public cmd_helper()
        {
            //Initialize
            InitializeComponent();
            Load_Cmd_String();
            updata_box();
        }

        private void Start_button_Click(object sender, EventArgs e)
        {
            myProcess.StartInfo = new ProcessStartInfo("cmd.exe")
            {
                RedirectStandardInput = true,
                UseShellExecute = false,
                WorkingDirectory = @"C:\",
                CreateNoWindow = true,
                Verb = "runas"

            };

            // event handlers for output & error
            myProcess.OutputDataReceived += myProcess_OutputDataReceived;
            myProcess.ErrorDataReceived += myProcess_ErrorDataReceived;

            // start process
            myProcess.Start();
            cmd_output_text.AppendText("cmd running...\n");
        }

        private void Close_buttom_Click(object sender, EventArgs e)
        {
            myProcess.Close();
            cmd_output_text.AppendText("cmd closed...\n");
        }

        private void myProcess_ErrorDataReceived(object sender, 
             DataReceivedEventArgs e)
        {
            Process myProcess = sender as Process;
            if (myProcess == null)
                return;
            cmd_output_text.AppendText(e.Data);
        }

        private void myProcess_OutputDataReceived(object sender, 
             DataReceivedEventArgs e)
        {
            Process myProcess = sender as Process;
            if (myProcess == null)
                return;
            cmd_output_text.AppendText(e.Data);
        }

        private void Send_cmd_button_Click(object sender, EventArgs e)
        {
         myProcess.StandardInput.Write(command[name.IndexOf(command_box.Text)] + myProcess.StandardInput.NewLine);
        }

Примечание: У меня есть две кнопки «Пуск» и «Стоп», которые будут открывать и закрывать cmd.exe. Пользователь должен набрать что-то вроде: dir, cd для некоторого dir, cd для другого dir

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Попробуй это.

private void myProcess_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    Process myProcess = sender as Process;
    if (myProcess == null)
        return;
    cmd_output_text.Invoke(new Action (delegate { cmd_output_text.AppendText("\n"+e.Data); }));
}

Также вам нужно добавить эту строку "myProcess.BeginOutputReadLine ();"к вашему коду

private void Start_button_Click(object sender, EventArgs e)
    {
        myProcess = new Process();
        myProcess.StartInfo = new ProcessStartInfo("cmd.exe")
        {
            RedirectStandardInput = true,
            UseShellExecute = false,
            RedirectStandardError=true,
            RedirectStandardOutput = true,
            WorkingDirectory = @"C:\",
            CreateNoWindow = true,
            Verb = "runas"

        };

        // event handlers for output & error
        myProcess.OutputDataReceived += myProcess_OutputDataReceived;
        myProcess.ErrorDataReceived += myProcess_ErrorDataReceived;

        // start process
        myProcess.Start();
        **myProcess.BeginOutputReadLine();**
        cmd_output_text.AppendText("cmd running...\n");
    }

Надеюсь, что это поможет вам!

0 голосов
/ 07 июня 2019
public static void Main()
{
      var p = new Process();  
      p.StartInfo.UseShellExecute = false;  
      p.StartInfo.RedirectStandardOutput = true;  
      p.StartInfo.FileName = "Write500Lines.exe";  
      p.Start();  

      // To avoid deadlocks, always read the output stream first and then wait.  
      string output = p.StandardOutput.ReadToEnd();  
      p.WaitForExit();

      Console.WriteLine(output);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...