Windowsフォームのロードイベントからコンソールアプリケーション(app.exeなど)を実行したい。 System.Diagnostics.Process.Start()を試しましたが、app.exeを開いた後、すぐに閉じます。
App.exeを実行して開いたままにする方法はありますか?
コンソールウィンドウを開いたままにしておきたい場合は、次のコマンドを使用して実行できます。
System.Diagnostics.Process.Start( @"cmd.exe", @"/k c:\path\my.exe" );
これを試してください:
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();
これであなたが求めている行動が得られると思います。コマンドウィンドウで出力を表示しようとしているだけではないと仮定します。出力を見たいだけなら、その答えのいくつかのバージョンがすでにあります。これは、アプリを実行してコンソールを開いたままにする方法です。
お役に立てれば。幸運を。
App.exeが何もしない場合、または作業がすぐに終了する場合(つまり、単に「Hello World」を出力して戻る場合)、説明したとおりに動作します。作業が完了した後もapp.exeを開いたままにしておきたい場合は、コンソールアプリケーションに何らかの完了メッセージの後にConsole.ReadKey();
を入力します。
App.exeのコードを変更できる場合は、Console.In.Read()
を追加するだけで、キーが押されるのを待つことができます。
app.exeもConsole.ReadLine()
で終わる可能性があります。これも、ソースコードを制御するC#アプリケーションであると想定しています。
マスター/スレーブアプリケーションのセットアップを考えると、次の2つの問題のいずれかが発生します。
最初の問題では、プロセスが完了するまで待機/ブロックする必要があります(つまり、Process.WaitForExit()
。
2番目の問題については、スレーブアプリが必要な処理を実行し(または例外をスローし)、すぐに終了しているようです。コマンドプロンプトから同じパラメーターを使用して実行し、出力を確認してください。
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
}
新しいテキストファイルを作成し、app.batという名前を付けて、そこに配置します。
app.exe
pause
これで、フォームがそのbatファイルを指すようになります。