Чтение выходных данных командного сценария в C # .Net Program - PullRequest
12 голосов
/ 18 сентября 2010

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

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

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

Ответы [ 3 ]

10 голосов
/ 18 сентября 2010

Учитывая обновленный вопрос.Вот как вы можете запустить 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();
4 голосов
/ 18 января 2011

Ваши пути хороши.Но вы получите только весь результат в конце.Я хотел вывод, когда скрипт работал.Так что здесь, во-первых, почти то же самое, но потом я исказил вывод.Если у вас есть проблемы, посмотрите: 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;
}

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

3 голосов
/ 18 сентября 2010

Вы не можете захватить вывод с помощью функции 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.

...