2009-11-30 16 views

Respuesta

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

Otra manera sería utilizar P/Invoke y utilizar ShellExecute directamente:

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

necesito Execut un script lua ... – RCIX

+0

@RCIX: ¿Cómo ¿lo hiciste ahora? Me refiero a la forma manual. –

+0

es decir, poner 'blah.lua somearg anotherarg thirdarg' en un comando de consola. – RCIX

2

hay una manera más fácil de manejar esto en C#. Usando el espacio de nombres System.Diagnostics, hay una clase para manejar procesos de desove.

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

hay parámetros adicionales para manejar las cosas como no se cree una ventana de la consola, la reorientación de entrada o salida, y la mayoría todo lo demás que había necesidad.

6

Es posible que desee considerar un enfoque asincrónico si el script tarda un tiempo.

Aquí hay un código que lo hace más redirecciona la salida estándar para capturar para mostrar en un formulario (WPF, Windows Forms, lo que sea). Tenga en cuenta que estoy suponiendo que no necesita de entrada del usuario, por lo que no crea la ventana de la consola, que se ve mejor:

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 para usar el trabajador de fondo correctamente y no bloquear todo el hilo. ¡Mejor experiencia de usuario! – ppumkin

Cuestiones relacionadas