Чтение выходных данных командного сценария в C# .Net Program

Для проекта я создаю новый интерфейс для старой системы пакетных скриптов. Я должен использовать Windows XP и C# с.Net. Я не хочу трогать эту старую бэкэнд-систему, так как она создана за прошедшее десятилетие. Так что моя идея состоит в том, чтобы начать cmd.exe Запрограммируйте и выполните там скрипт Bash. Для этого я буду использовать "системную" функцию в.Net.

Но мне также нужно прочитать "Вывод командной строки пакетного скрипта" обратно в мою программу на C#. Я мог бы перенаправить его в файл. Но должен быть способ получить стандартный вывод от CMD.exe в моей программе C#.

Большое спасибо!

3 ответа

Решение

Твои пути хороши. Но вы получите только весь результат в конце. Я хотел вывод, когда скрипт работал. Так что здесь, во-первых, почти то же самое, но потом я исказил вывод. Если у вас есть проблемы, посмотрите: http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.aspx

public void execute(string workingDirectory, string command)
{   

    // create the ProcessStartInfo using "cmd" as the program to be run, and "/c " as the parameters.
    // Incidentally, /c tells cmd that we want it to execute the command that follows, and then exit.
    System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo(workingDirectory + "\\" + "my.bat ", command);

    procStartInfo.WorkingDirectory = workingDirectory;

    //This means that it will be redirected to the Process.StandardOutput StreamReader.
    procStartInfo.RedirectStandardOutput = true;
    //This means that it will be redirected to the Process.StandardError StreamReader. (same as StdOutput)
    procStartInfo.RedirectStandardError = true;

    procStartInfo.UseShellExecute = false;
    // Do not create the black window.
    procStartInfo.CreateNoWindow = true;
    // Now we create a process, assign its ProcessStartInfo and start it
    System.Diagnostics.Process proc = new System.Diagnostics.Process();

    //This is importend, else some Events will not fire!
     proc.EnableRaisingEvents = true;

    // passing the Startinfo to the process
    proc.StartInfo = procStartInfo;

    // The given Funktion will be raised if the Process wants to print an output to consol                    
    proc.OutputDataReceived += DoSomething;
    // Std Error
    proc.ErrorDataReceived += DoSomethingHorrible;
    // If Batch File is finished this Event will be raised
    proc.Exited += Exited;
}

Что-то не так, но что бы вы ни поняли...

DoSomething это функция:

void DoSomething(object sendingProcess, DataReceivedEventArgs outLine);
{
   string current = outLine.Data;
}

Надеюсь это поможет

Учитывая обновленный вопрос. Вот как вы можете запустить cmd.exe запустить пакетный файл и записать вывод сценария в приложении C#.

var process = new Process();
var startinfo = new ProcessStartInfo("cmd.exe", @"/C c:\tools\hello.bat");
startinfo.RedirectStandardOutput = true;
startinfo.UseShellExecute = false;
process.StartInfo = startinfo;
process.OutputDataReceived += (sender, args) => Console.WriteLine(args.Data); // do whatever processing you need to do in this handler
process.Start();
process.BeginOutputReadLine();
process.WaitForExit();

Вы не можете захватить вывод с system функция, вы должны пойти немного глубже в API подпроцесса.

using System;
using System.Diagnostics;
Process process = Process.Start(new ProcessStartInfo("bash", path_to_script) {
                                    UseShellExecute = false,
                                    RedirectStandardOutput = true
                                });
string output = process.StandardOutput.ReadToEnd();
process.WaitForExit();
if (process.ExitCode != 0) { … /*the process exited with an error code*/ }

Вы, похоже, не понимаете, пытаетесь ли вы запустить скрипт bash или командный файл. Это не одно и то же. Bash - это оболочка Unix, для которой существует несколько портов Windows. "Пакетный файл" - это имя, которое обычно присваивается сценариям cmd. Приведенный выше код предполагает, что вы хотите запустить скрипт bash. Если вы хотите запустить скрипт cmd, измените bash в cmd, Если вы хотите запустить скрипт bash и bash.exe не на вашем PATH, менять bash на полный путь к bash.exe,

Другие вопросы по тегам