Выполнить команду оболочки из приложения .NET - PullRequest
5 голосов
/ 30 ноября 2009

Мне нужно выполнить команду оболочки из моего приложения .NET, в отличие от os.execute (немного дальше на этой странице) в Lua . Однако при беглом поиске я ничего не смог найти. Как мне это сделать?

Ответы [ 3 ]

9 голосов
/ 30 ноября 2009
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 напрямую:

[DllImport("shell32.dll")]
static extern IntPtr ShellExecute(
    IntPtr hwnd,
    string lpOperation,
    string lpFile,
    string lpParameters,
    string lpDirectory,
    ShowCommands nShowCmd);
6 голосов
/ 30 ноября 2009

Возможно, вы захотите рассмотреть асинхронный подход, если сценарий занимает некоторое время.

Вот некоторый код, который делает это плюс перенаправляет стандартный вывод для захвата для отображения на форме ( WPF , Windows Forms , что угодно). Обратите внимание, что я предполагаю, что вам не нужен пользовательский ввод, поэтому он не создает окно консоли, которое выглядит лучше:

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";
}
2 голосов
/ 30 ноября 2009

Существует простой способ справиться с этим в C #. Используя пространство имен 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();

Существуют дополнительные параметры для обработки таких вещей, как не создание окна консоли, перенаправление ввода или вывода и большинство всего, что вам нужно.

...