programing

.NET을 사용하여 동일한 프로세스로 여러 명령 줄 실행

kingscode 2021. 1. 17. 10:57
반응형

.NET을 사용하여 동일한 프로세스로 여러 명령 줄 실행


매번 새 프로세스를 만들지 않고 여러 명령을 실행하려고합니다. 기본적으로 DOS 명령 셸을 시작하고 MySQL 명령 셸로 전환 한 다음 명령을 실행합니다. 절차를 호출하는 방법은 다음과 같습니다 (아래 참조). 또한 명령에서 "\"를 어떻게 처리합니까?

ExecuteCommand("mysql --user=root --password=sa casemanager", 100, false);

ExecuteCommand(@"\. " + Environment.CurrentDirectory + @"\MySQL\CaseManager.sql", 100, true);

private void ExecuteCommand(string Command, int Timeout, Boolean closeProcess)
{
    ProcessStartInfo ProcessInfo;
    Process Process;

    ProcessInfo = new ProcessStartInfo("cmd.exe", "/C " + Command);
    ProcessInfo.CreateNoWindow = false;
    ProcessInfo.UseShellExecute = false;
    Process = Process.Start(ProcessInfo);
    Process.WaitForExit(Timeout);

    if (closeProcess == true) { Process.Close(); }
}

표준 입력을 리디렉션하고 StreamWriter를 사용하여 쓸 수 있습니다.

        Process p = new Process();
        ProcessStartInfo info = new ProcessStartInfo();
        info.FileName = "cmd.exe";
        info.RedirectStandardInput = true;
        info.UseShellExecute = false;

        p.StartInfo = info;
        p.Start();

        using (StreamWriter sw = p.StandardInput)
        {
            if (sw.BaseStream.CanWrite)
            {
                sw.WriteLine("mysql -u root -p");
                sw.WriteLine("mypassword");
                sw.WriteLine("use mydb;");
            }
        }

const string strCmdText = "/C command1&command2";
Process.Start("CMD.exe", strCmdText);

임시 폴더의 .cmd 파일에 모든 명령을 작성한 다음 해당 파일을 실행할 수는 없습니까?


ProcessStartInfo pStartInfo = new ProcessStartInfo();
pStartInfo.FileName = "CMD";
pStartInfo.Arguments = @"/C mysql --user=root --password=sa casemanager && \. " + Environment.CurrentDirectory + @"\MySQL\CaseManager.sql"
pStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
Process.Start(pStartInfo);

&&실행 다른 명령이 있다는 명령 쉘을 알 수있는 방법입니다.


또 다른 답변이 최신 버전의 Windows에서 암시 하듯이 표준 출력 및 / 또는 표준 오류 스트림을 읽어야하는 것으로 보입니다. 그렇지 않으면 명령 사이에 중단됩니다. 지연을 사용하는 대신이를 수행하는 깔끔한 방법은 비동기 콜백을 사용하여 스트림의 출력을 사용하는 것입니다.

static void RunCommands(List<string> cmds, string workingDirectory = "")
{
    var process = new Process();
    var psi = new ProcessStartInfo();
    psi.FileName = "cmd.exe";
    psi.RedirectStandardInput = true;
    psi.RedirectStandardOutput = true;
    psi.RedirectStandardError = true;
    psi.UseShellExecute = false;
    psi.WorkingDirectory = workingDirectory;
    process.StartInfo = psi;
    process.Start();
    process.OutputDataReceived += (sender, e) => { Console.WriteLine(e.Data); };
    process.ErrorDataReceived += (sender, e) => { Console.WriteLine(e.Data); };
    process.BeginOutputReadLine();
    process.BeginErrorReadLine();
    using (StreamWriter sw = process.StandardInput)
    {
        foreach (var cmd in cmds)
        {
            sw.WriteLine (cmd);
        }
    }
    process.WaitForExit();
}

명령 줄 공정은 cmd.exe또는 mysql.exe일반적으로 읽기 (및 실행)합니다 당신이 무엇을 (키보드에서)에서 (사용자)를 입력합니다.

이를 모방하기 위해 http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardinput.aspxRedirectStandardInput 속성 을 사용하고 싶습니다 .


다음과 같이 주어진 파일에서 명령을 실행하도록 MySQL에 지시 할 수도 있습니다.

mysql --user=root --password=sa casemanager < CaseManager.sql

다른 명령을 보내기 전에 입력에서 모든 데이터를 읽어야합니다!

데이터를 사용할 수없는 경우 READ를 요청할 수 없습니다.

My solutions... when ask to read... ask to read a big buffer... like 1 MEGA...

And you will need wait a min 100 milliseconds... sample code...

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()


        Dim Response As String = String.Empty
        Dim BuffSize As Integer = 1024 * 1024
        Dim x As Char() = New Char(BuffSize - 1) {}
        Dim bytesRead As Integer = 0


        oProcess.StandardInput.WriteLine("dir")
        Threading.Thread.Sleep(100)
        bytesRead = oProcess.StandardOutput.Read(x, 0, BuffSize)
        Response = String.Concat(Response, String.Join("", x).Substring(0, bytesRead))




        MsgBox(Response)
        Response = String.Empty






        oProcess.StandardInput.WriteLine("dir c:\")
        Threading.Thread.Sleep(100)
        bytesRead = 0
        bytesRead = oProcess.StandardOutput.Read(x, 0, BuffSize)
        Response = String.Concat(Response, String.Join("", x).Substring(0, bytesRead))

        MsgBox(Response)


    End Sub
End Class

ReferenceURL : https://stackoverflow.com/questions/437419/execute-multiple-command-lines-with-the-same-process-using-net

반응형