Вопрос по console, stdin, stdout, cmd, c# – Перенаправить ввод и вывод для cmd.exe

4

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

Process p = new Process()
{
    StartInfo = new ProcessStartInfo("cmd")
    {
       UseShellExecute = false,
       RedirectStandardInput = true,
       RedirectStandardOutput = true,
       CreateNoWindow = true,
       Arguments = String.Format("/c \"{0}\"", command),
    }
};
p.OutputDataReceived += (s, e) => Messagebox.Show(e.Data);
p.Start();
p.BeginOutputReadLine();
p.WaitForExit();

Но как насчет ряда команд, таких как WriteLine ():

p.StandardInput.WriteLine("cd...");
p.StandardInput.WriteLine("dir");

как получить выход в этой ситуации?

уточнить: Вы хотите, чтобы все выходы ваших команд? или только последний? призваниеRunWithRedirect() последовательно уже достигает своей цели. Raptor
в то время как мои команды в серии. Sth как "CD-путь " а потом "сделать что-нибудьЯ хочу все выходы L_G
как насчет вызоваRunWithRedirect() последовательно? звучит без проблем в вашем случае. Raptor

Ваш Ответ

1   ответ
4

/k переключиться на запускcmd.exe в интерактивном режиме.

Проблема состоит в том, чтобы отделить входные данные от разных команд. Для этого вы можете изменить стандартное приглашение, используяprompt команда:

prompt --Prompt_C2BCE8F8E2C24403A71CA4B7F7521F5B_F659E9F3F8574A72BE92206596C423D5 

Так что теперь довольно легко определить конец вывода команды.

Вот полный код:

public static IEnumerable<string> RunCommands(params string[] commands) {
    var process = new Process {
        StartInfo = new ProcessStartInfo("cmd") {
            UseShellExecute = false,
            RedirectStandardInput = true,
            RedirectStandardOutput = true,
            CreateNoWindow = true,
            Arguments = "/k",
        }
    };

    process.Start();

    const string prompt = "--Prompt_C2BCE8F8E2C24403A71CA4B7F7521F5B_F659E9F3F8574A72BE92206596C423D5 ";

    // replacing standard prompt in order to determine end of command output
    process.StandardInput.WriteLine("prompt " + prompt);
    process.StandardInput.Flush();
    process.StandardOutput.ReadLine();
    process.StandardOutput.ReadLine();

    var result = new List<string>();

    try {
        var commandResult = new StringBuilder();

        foreach (var command in commands) {
            process.StandardInput.WriteLine(command);
            process.StandardInput.WriteLine();
            process.StandardInput.Flush();

            process.StandardOutput.ReadLine();

            while (true) {
                var line = process.StandardOutput.ReadLine();

                if (line == prompt) // end of command output
                    break;

                commandResult.AppendLine(line);
            }

            result.Add(commandResult.ToString());

            commandResult.Clear();

        }
    } finally {
        process.Kill();
    }

    return result;
}
</string></string>

Это хорошо работает, но похоже на один большой взлом.

Я рекомендую вам использовать процесс для каждой команды.

Потрясающие!это подходит для меня L_G
Что вы имеете в виду, используя вместо этого процесс для каждой команды? @SHSE 0xFFFFFF
Где волшебная нить--Prompt_C2 от? Lei Yang

Похожие вопросы