web-dev-qa-db-ja.com

Windowsフォームからコンソールアプリケーションを実行する方法は?

Windowsフォームのロードイベントからコンソールアプリケーション(app.exeなど)を実行したい。 System.Diagnostics.Process.Start()を試しましたが、app.exeを開いた後、すぐに閉じます。

App.exeを実行して開いたままにする方法はありますか?

13
Or Betzalel

コンソールウィンドウを開いたままにしておきたい場合は、次のコマンドを使用して実行できます。

System.Diagnostics.Process.Start( @"cmd.exe", @"/k c:\path\my.exe" );
12
Mark Wilkins

これを試してください:

        string cmdexePath = @"C:\Windows\System32\cmd.exe";
        //notice the quotes around the below string...
        string myApplication = "\"C:\\Windows\\System32\\ftp.exe\"";
        //the /K keeps the CMD window open - even if your windows app closes
        string cmdArguments = String.Format("/K {0}", myApplication);
        ProcessStartInfo psi = new ProcessStartInfo(cmdexePath, cmdArguments);
        Process p = new Process();
        p.StartInfo = psi;
        p.Start();

これであなたが求めている行動が得られると思います。コマンドウィンドウで出力を表示しようとしているだけではないと仮定します。出力を見たいだけなら、その答えのいくつかのバージョンがすでにあります。これは、アプリを実行してコンソールを開いたままにする方法です。

お役に立てれば。幸運を。

3
Audie

App.exeが何もしない場合、または作業がすぐに終了する場合(つまり、単に「Hello World」を出力して戻る場合)、説明したとおりに動作します。作業が完了した後もapp.exeを開いたままにしておきたい場合は、コンソールアプリケーションに何らかの完了メッセージの後にConsole.ReadKey();を入力します。

2
Mark Carpenter

App.exeのコードを変更できる場合は、Console.In.Read()を追加するだけで、キーが押されるのを待つことができます。

1
user203570

app.exeもConsole.ReadLine()で終わる可能性があります。これも、ソースコードを制御するC#アプリケーションであると想定しています。

1
Austin Salonen

マスター/スレーブアプリケーションのセットアップを考えると、次の2つの問題のいずれかが発生します。

  1. マスターアプリが開いてフォームが表示されます。そのフォームはスレーブアプリを実行し、スレーブアプリがまだ実行されていても、すぐに閉じます。
  2. マスターアプリが開いてフォームが表示され、そのフォームがスレーブアプリを実行してすぐに閉じます。

最初の問題では、プロセスが完了するまで待機/ブロックする必要があります(つまり、Process.WaitForExit()

2番目の問題については、スレーブアプリが必要な処理を実行し(または例外をスローし)、すぐに終了しているようです。コマンドプロンプトから同じパラメーターを使用して実行し、出力を確認してください。

1
Neil Barnwell

App.exeを制御できる場合は、app.exeがどのように機能するかを知っておく必要があります。そのため、内部の動作を制御できないと想定します。その場合は、app.exeの呼び出し方法に関する詳細情報を提供する場合と提供しない場合があるヘルプフラグを渡してみてください。次のようなものを試してください。

private startApp()
{
    string command = " -h"; //common help flag for console apps
    System.Diagnostics.Process pRun;
    pRun = new System.Diagnostics.Process();
    pRun.EnableRaisingEvents = true;
    pRun.Exited += new EventHandler(pRun_Exited);
    pRun.StartInfo.FileName = "app.exe";
    pRun.StartInfo.Arguments = command;
    pRun.StartInfo.WindowStyle =  System.Diagnostics.ProcessWindowStyle.Normal

    pRun.Start();
    pRun.WaitForExit();
}
private void  pRun_Exited(object sender, EventArgs e)
{
    //Do Something Here
}
1
J.Hendrix

新しいテキストファイルを作成し、app.batという名前を付けて、そこに配置します。

app.exe
pause

これで、フォームがそのbatファイルを指すようになります。

0
SethCoder