Не удалось отправить команды процессу cmd.exe

Я пытаюсь отправить команды в открытый процесс cmd.exe с помощьюStandardInput.WriteLine(str)Однако ни одна из команд, похоже, не отправлена. Сначала я открываю процесс с глобальной переменной p (Process p).

p = new Process()
{
    StartInfo = {
        CreateNoWindow = true,
        UseShellExecute = false,
        RedirectStandardError = true,
        RedirectStandardInput = true,
        RedirectStandardOutput = true,
        FileName = @"cmd.exe",
        Arguments = "/C" //blank arguments
    }
};

p.Start();
p.WaitForExit();

После этого я пытаюсь отправить команду, используя простой метод, который записывает результат в текстовое поле.

private void runcmd(string command)
{
    p.StandardInput.WriteLine(command);
    var output = p.StandardOutput.ReadToEnd();
    TextBox1.Text = output;
}

Прямо сейчас я проверяю это сDIR, ноvar output отображается как ноль, что приводит к отсутствию вывода. Есть ли лучший способ отправить команду процессу open cmd.exe?

 user601777421 июл. 2016 г., 00:49
Cmd /c начинается, затем заканчивается CMD.
 Quantic20 июл. 2016 г., 23:17
Вы должны позвонитьp.StandardOutput.ReadToEnd() до p.WaitForExit()В противном случае вы можете зайти в тупик. УвидетьВот, Вы не упомянули тупик, но это может быть вашей проблемой.
 FyreeW20 июл. 2016 г., 23:18
Попытка избавиться от p.WaitForExit (), и проблема все еще возникла.

Ответы на вопрос(1)

Решение Вопроса

не закрывая stdin, но он работает с асинхронным чтением для stdout / stderr. Не нужно проходить в/cВы делаете это только при передаче командычерез аргументы; вы этого не делаете, вы отправляете команду непосредственно на вход.

var p = new Process()
{
    StartInfo = {
    CreateNoWindow = false,
    UseShellExecute = false,
    RedirectStandardError = true,
    RedirectStandardInput = true,
    RedirectStandardOutput = true,
    FileName = @"cmd.exe"}
};
p.OutputDataReceived += (sender, args1) => Console.WriteLine(args1.Data);
p.ErrorDataReceived += (sender, args1) => Console.WriteLine(args1.Data);
p.Start();
p.BeginOutputReadLine();
p.StandardInput.WriteLine("dir");
p.StandardInput.WriteLine("cd e:");
p.WaitForExit();

Console.WriteLine("Done");
 Quantic21 июл. 2016 г., 18:22
Вы используете "Консольное приложение"?Console.WriteLine()s пишет в консоль приложения, а не в "cmd.exe", поэтому если вы запускаете консольное приложение, возможно, заменитеConsole.WriteLine()с твоимTextBox1.Text =  вместо.
 Quantic21 июл. 2016 г., 18:02
@FyreeW ты должен избавиться отArguments = "/C", Если вы копируете и вставляете мой код точно, он будет работать, тогда вам придется работать немного назад и заставить его делать то, что вы хотите.
 FyreeW21 июл. 2016 г., 17:59
Я вижу всплывающую оболочку cmd, но ничего не выводится.
 FyreeW21 июл. 2016 г., 00:02
Еще ничего. Также мне нужно держать процесс открытым для нескольких команд, поэтому я не могу его закрыть.
 FyreeW21 июл. 2016 г., 18:32
Я работал в простом консольном приложении, однако при попытке добавить его в текстовое поле возникает проблема с тем, что он находится в другом потоке (пытается получить доступ к текстовому полю из другого потока, чем он был создан). Хотя все еще работает, так что это было решением проблемы! Спасибо!
 Quantic21 июл. 2016 г., 16:46
@FyreeW При синхронном чтении стандартного вывода я мог только заставить его работать, закрывая стандартный вывод независимо от того, что я пытался. Но, кажется, все работает нормально с асинхронным чтением для stdout. Я отредактировал свой ответ с помощью асинхронной версии.
 FyreeW21 июл. 2016 г., 18:17
Я убедился, что использовал именно ваш код выше (только что создал новый метод).

Ваш ответ на вопрос