Одна небольшая вещь, могла бы добавить ясность для переопределения значения по умолчанию в течение многих секунд
>>> b = a + datetime.timedelta(seconds=3000)
>>> b
datetime.datetime(1, 1, 1, 12, 24, 59)
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);
Вы можете рассмотреть асинхронный подход, если сценарий требует времени.
Вот код, который делает это, а также перенаправляет стандартный вывод для захвата для отображения в форме ( 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";
}
В 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();
Существуют дополнительные параметры для обработки таких вещей, как отказ от создания окна консоли, перенаправление ввода или вывода и многое другое, что вам может понадобиться.