Выполнить несколько командных строк с одним и тем же процессом, используя C # - PullRequest
3 голосов
/ 17 мая 2010

Привет, в соответствии с моим последним вопросом здесь Я пытаюсь написать редактор SQL или что-то вроде этого, таким образом я пытаюсь подключиться к CMD из C # и выполнить мою команду. Теперь моя проблема в том, что я подключаюсь к SQLPLUS, после чего я не могу получить команду SQLPLUS, и другой ресурс, который я проверяю, меня не удовлетворяет. Пожалуйста, помогите мне, как после того, как я подключился к sqlplus, я могу запустить мой процесс для запуска команды sql? сейчас я использую этот код:

//Create process
System.Diagnostics.Process pProcess = new System.Diagnostics.Process();

//strCommand is path and file name of command to run
pProcess.StartInfo.FileName = strCommand;

//strCommandParameters are parameters to pass to program
pProcess.StartInfo.Arguments = strCommandParameters;

pProcess.StartInfo.UseShellExecute = false;

//Set output of program to be written to process output stream
pProcess.StartInfo.RedirectStandardOutput = true;

//Optional
pProcess.StartInfo.WorkingDirectory = strWorkingDirectory;

//Start the process
pProcess.Start();

//Get program output
string strOutput = pProcess.StandardOutput.ReadToEnd();

//Wait for process to finish
pProcess.WaitForExit();

Я настроил это. Я разделяю инициализацию, я создал объект процесса один раз, когда у меня все еще есть проблема, чтобы выполнить вторую команду, я использую эти коды для второго вызова:

pProcess.StartInfo.FileName = strCommand;

//strCommandParameters are parameters to pass to program
pProcess.StartInfo.Arguments = strCommandParameters;
//Start the process
pProcess.Start();

//Get program output
string strOutput = pProcess.StandardOutput.ReadToEnd();

//Wait for process to finish
pProcess.WaitForExit();

Заранее спасибо

Ответы [ 2 ]

6 голосов
/ 17 мая 2010

Ваш вопрос немного сбивает с толку, но я думаю, что вижу вашу проблему.Сначала вы должны проверить этот пост в блоге, чтобы увидеть типичные проблемы с System.Diagnostics.Process .Ваш код нарушает тот, который там не указан.Повторное использование самого объекта Process.

Вам необходимо выполнить рефакторинг кода, например:

    class MyProcessStarter
    {
        private ProcessStartInfo _startInfo = new ProcessStartInfo();
        public MyProcessStarter(string exe, string workingDir)
        {
            _startInfo.WorkingDirectory = workingDir;
            _startInfo.FileName = exe;
            _startInfo.UseShellExecute = false;
            _startInfo.RedirectStandardOutput = true;
        }

        public string Run(string arguments)
        {
            _startInfo.Arguments = arguments;
            Process p = Process.Start(_startInfo);
            p.Start();
            string strOutput = p.StandardOutput.ReadToEnd();
            p.WaitForExit();
            return strOutput;
        }
    }

Я написал более полную и точную реализацию под названием ProcessRunner .Следующее демонстрирует его использование для выполнения той же операции:

using CSharpTest.Net.Processes;
partial class Program
{
    static int Main(string[] args)
    {

        ProcessRunner run = new ProcessRunner("svn.exe");
        run.OutputReceived += new ProcessOutputEventHandler(run_OutputReceived);
        return run.Run("update", "C:\\MyProject");
    }

    static void run_OutputReceived(object sender, ProcessOutputEventArgs args)
    {
        Console.WriteLine("{0}: {1}", args.Error ? "Error" : "Output", args.Data);
    }
}
1 голос
/ 06 июля 2014

Вам необходимо СЧИТАТЬ ВСЕ данные с ввода, прежде чем отправить другую команду!

И вы не можете попросить ПРОЧИТАТЬ, если нет доступных данных ... немного сосать, не так ли?

Мои решения ... когда просят прочитать ... просят прочитать большой буфер ... как 1 МЕГА ...

И вам нужно будет подождать минимум 100 миллисекунд ... пример кода ...

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim oProcess As New Process()
        Dim oStartInfo As New ProcessStartInfo("cmd.exe", "")
        oStartInfo.UseShellExecute = False
        oStartInfo.RedirectStandardOutput = True
        oStartInfo.RedirectStandardInput = True
        oStartInfo.CreateNoWindow = True
        oProcess.StartInfo = oStartInfo
        oProcess.Start()

        oProcess.StandardInput.WriteLine("dir")


        Threading.Thread.Sleep(100)

        Dim Response As String = String.Empty

        Dim BuffSize As Integer = 1024 * 1024
        Dim bytesRead As Integer = 0

        Do

            Dim x As Char() = New Char(BuffSize - 1) {}
            bytesRead = oProcess.StandardOutput.Read(x, 0, BuffSize)

            Response = String.Concat(Response, String.Join("", x).Substring(0, bytesRead))            

        Loop While oProcess.StandardOutput.Peek >= 0



        MsgBox(Response)
        Response = String.Empty



        oProcess.StandardInput.WriteLine("dir c:\")




        Threading.Thread.Sleep(100)


        bytesRead = 0

        Do

            Dim x As Char() = New Char(BuffSize - 1) {}
            bytesRead = oProcess.StandardOutput.Read(x, 0, BuffSize)

            Response = String.Concat(Response, String.Join("", x).Substring(0, bytesRead))
            'Response = String.Concat(Response, String.Join("", x))

        Loop While oProcess.StandardOutput.Peek >= 0

        MsgBox(Response)


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