5

.NET アプリケーションからシェル コマンドを実行する必要があります。これは、 Luaos.executeの (そのページの少し下にある)とは異なります。しかし、大雑把な検索では何も見つかりませんでした。どうすればいいのですか?

4

3 に答える 3

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 を直接使用することです。

[DllImport("shell32.dll")]
static extern IntPtr ShellExecute(
    IntPtr hwnd,
    string lpOperation,
    string lpFile,
    string lpParameters,
    string lpDirectory,
    ShowCommands nShowCmd);
于 2009-11-30T02:15:15.157 に答える
6

スクリプトに時間がかかる場合は、非同期アプローチを検討することをお勧めします。

これに加えて、標準出力をフォーム ( WPFWindows 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";
}
于 2009-11-30T02:57:00.927 に答える
2

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

コンソール ウィンドウを作成しない、入力または出力をリダイレクトするなど、必要なほとんどすべてを処理するための追加のパラメーターがあります。

于 2009-11-30T02:33:44.860 に答える