.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
'programing' 카테고리의 다른 글
Angular material $ mdToast의 메시지 유형에 따라 Toast의 색상을 어떻게 변경할 수 있습니까? (0) | 2021.01.17 |
---|---|
iOS는 다른 배열에서 배열 요소를 신속하게 제거합니다. (0) | 2021.01.17 |
프로그래머가 아닌 사람에게 프로젝트 복잡성을 설명하는 좋은 은유가 있습니까? (0) | 2021.01.16 |
C의 삼항 (조건부) 연산자 (0) | 2021.01.16 |
Java 8보다 Java 11에서 현저하게 느린 스택 추적 소비 (0) | 2021.01.16 |