2009-11-30 4 views
5

Luaos.execute (그 페이지에서 약간 아래로)과 다른 .NET 응용 프로그램에서 셸 명령을 실행해야합니다. 그러나 간단한 검색으로 나는 아무것도 찾을 수 없었다. 어떻게해야합니까?.NET 응용 프로그램에서 셸 명령 실행

[DllImport("shell32.dll")] 
static extern IntPtr ShellExecute(
    IntPtr hwnd, 
    string lpOperation, 
    string lpFile, 
    string lpParameters, 
    string lpDirectory, 
    ShowCommands nShowCmd); 

답변

9
System.Diagnostics.Process p = new System.Diagnostics.Process(); 
p.StartInfo.FileName = "blah.lua arg1 arg2 arg3"; 
p.StartInfo.UseShellExecute = true; 
p.Start(); 

또 다른 방법은 P/Invoke를 사용하여 직접에서 ShellExecute를 사용하는 것입니다. System.Diagnostics 네임 스페이스를 사용하여 스폰 프로세스를 처리하는 클래스가 있습니다.

System.Diagnostics.Process process = new System.Diagnostics.Process(); 
process.StartInfo.FileName = "App.exe"; 
process.StartInfo.Arguments = "arg1 arg2 arg3"; 
process.Start(); 

Console.WriteLine(process.StandardOutput.ReadToEnd(); 

는, 콘솔 창을 만들 입력 또는 출력, 그리고 당신이 필요로하는 것 대부분의 다른 아무것도 리디렉션하지 일들을 처리하기 위해 추가 매개 변수가 있습니다.

+0

... – RCIX

+0

@RCIX : 나는 그것을 더 잘 보이는 콘솔 창을 만들지 않습니다 있도록, 사용자 입력이 필요하지 않습니다 있으리라 믿고있어 참고하는 방법 너 지금 했니? 수동 방식으로 말입니다. –

+0

즉 'blah.lua somearg anotherarg thirdarg'을 콘솔 명령에 넣습니다. – RCIX

2

C#에서이를 처리 할 수있는 쉬운 방법이있다 :

6

스크립트가 오래 걸리면 비동기 방식을 고려할 수 있습니다.

여기에 양식을 표시하기 위해 캡처하도록 표준 출력을 리디렉션하는 코드가 있습니다 (WPF, Windows Forms).

나는 루아 스크립트를 execut 필요
BackgroundWorker worker = new BackgroundWorker(); 
... 
// Wire up event in the constructor or wherever is appropriate 
worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); 
... 
// Then to execute your script 
worker.RunWorkerAsync("somearg anotherarg thirdarg"); 

void worker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    StringBuilder result = new StringBuilder(); 
    Process process = new Process(); 
    process.StartInfo.FileName = "blah.lua"; 
    process.StartInfo.Arguments = (string)e.Argument; 
    process.StartInfo.UseShellExecute = false; 
    process.StartInfo.RedirectStandardOutput = true; 
    process.StartInfo.CreateNoWindow = true; 
    process.Start(); 
    result.Append(process.StandardOutput.ReadToEnd()); 
    process.WaitForExit(); 
    e.Result = result.AppendLine().ToString(); 
} 

void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (e.Result != null) console.Text = e.Result.ToString(); 
    else if (e.Error != null) console.Text = e.Error.ToString(); 
    else if (e.Cancelled) console.Text = "User cancelled process"; 
} 
+0

+1 배경 작업자를 올바르게 사용하고 전체 스레드를 차단하지 않으려면 +1하십시오. 훨씬 나은 사용자 환경! – ppumkin

관련 문제