Отсутствует последняя строка при перенаправлении вывода / ввода cmd.exe (в C #) - PullRequest
2 голосов
/ 23 декабря 2011

Я пытаюсь запустить CMD.exe и управлять им через C # RichTextArea (не выполняя только одну команду, а заставляя ее ждать следующего пользовательского ввода, как в командной строке). Кажется, работает, но он не перенаправляет последнюю строку вывода (например, классический «Нажмите любую клавишу для продолжения ...» после выполнения или рабочий каталог перед курсором), пока я не отправлю другой ввод. Это основной код:

class CmdPanel : Panel
{
    CmdTextArea textArea;

    Process winCmdProcess;

    public CmdPanel()
    {
        this.BorderStyle = BorderStyle.None;

        textArea = new CmdTextArea(this);
        this.Controls.Add(textArea);

        this.InitializeComponent();
        this.StartShell();
    }

    public void StartShell()
    {
        this.winCmdProcess = new Process();
        this.winCmdProcess.StartInfo.FileName = "cmd.exe";
        this.winCmdProcess.StartInfo.UseShellExecute = false;
        this.winCmdProcess.StartInfo.RedirectStandardOutput = true;
        this.winCmdProcess.StartInfo.RedirectStandardError = true;
        this.winCmdProcess.StartInfo.RedirectStandardInput = true;
        this.winCmdProcess.StartInfo.CreateNoWindow = true;
        this.winCmdProcess.OutputDataReceived += new DataReceivedEventHandler(winCmdProcess_OutputDataReceived);
        this.winCmdProcess.ErrorDataReceived += new DataReceivedEventHandler(winCmdProcess_ErrorDataReceived);

        this.winCmdProcess.Start();
        this.winCmdProcess.BeginOutputReadLine();
        this.winCmdProcess.BeginErrorReadLine();

    }

    /// <summary>
    /// Executes a given command
    /// </summary>
    /// <param name="command"> A string that contains the command, with args</param>
    public void Execute(String command)
    {
        if (!string.IsNullOrWhiteSpace(command))
        {
            this.winCmdProcess.StandardInput.WriteLine(command);
        }
    }

    private void winCmdProcess_OutputDataReceived(object sendingProcess, DataReceivedEventArgs outLine)
    {
        this.ShowOutput(outLine.Data);
    }

    private void winCmdProcess_ErrorDataReceived(object sendingProcess, DataReceivedEventArgs outLine)
    {
        this.ShowOutput(outLine.Data);
    }

    delegate void ShowOutputCallback(string text);
    private void ShowOutput(string text)
    {
        if (this.textArea.InvokeRequired)
        {
            ShowOutputCallback call = new ShowOutputCallback(ShowOutput);
            this.Invoke(call, new object[] { text });
        }
        else
        {
            this.textArea.AppendText(text + Environment.NewLine);
        }
    }

    private void InitializeComponent()
    {

    }

(Я не даю подробностей о текстовой области, но она отправляет новые команды методу Execute.)

Чего мне не хватает?

1 Ответ

1 голос
/ 23 декабря 2011

Событие не сработает, если не будет выведена новая строка (или до тех пор, пока поток не будет закрыт или буфер не заполнится), поэтому частичная строка или командная строка не будут вызывать событие.

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