2016-07-09 10 views
0

それがこの同類を探しますので、私は、コンソールモードでmariadbを起動するバッチスクリプトを持っている:C#が新しいウィンドウなしでバッチスクリプトを実行して、リッチテキストボックスに、すべての(標準/エラー)出力をリダイレクト

ランC#のWinFormアプリを使用mariadb.bat

@echo off 
cd /D mariadb-10.1.14-win32\bin && mysqld.exe --console 
@pause 

は、私はこのバッチスクリプトを起動して、リッチテキストボックスに、すべての出力を取得したいのですが。

これは私がこれまでしているコードです:

// Configure db server process 
Process dbServer = new Process(); 
dbServer.StartInfo.FileName = "cmd"; 
dbServer.StartInfo.Arguments = "/c start /wait run-mariadb.bat"; 
dbServer.StartInfo.CreateNoWindow = true; 
dbServer.StartInfo.UseShellExecute = false; 
dbServer.StartInfo.RedirectStandardOutput = true; 
dbServer.StartInfo.RedirectStandardError = true; 
dbServer.OutputDataReceived += new DataReceivedEventHandler(HandleDBServerOutput); 
dbServer.ErrorDataReceived += new DataReceivedEventHandler(HandleDBServerOutput); 

これらは私のヘルパーメソッドです:

string FormatOutput(string message) 
{ 
    return string.Format("[ {0} ] : {1}", 
     DateTime.Now.ToShortTimeString(), 
     message); 
} 

void HandleDBServerOutput(object sender, DataReceivedEventArgs e) 
{ 
    this.BeginInvoke(new MethodInvoker(() => 
    { 
     if (!string.IsNullOrEmpty(e.Data)) 
      dbLogsRTB.AppendText(FormatOutput(e.Data)); 
    })); 
} 

私はこのようなプロセスを開始します。

// Start database server 
dbServer.Start(); 
dbServer.BeginOutputReadLine(); 
dbServer.WaitForExit(); 

上記新しいコマンドプロンプトウィンドウが作成され、そこにmariadbが実行されています。 dbServer.StartInfo.CreateNoWindow = true;が無視される理由は何ですか?

答えて

0

とオフstart開始のヘルプ:

は、指定したプログラムまたはコマンドを実行するために、別のウィンドウを起動します。

つまり、startをコマンドの一部として実行すると、新しいウィンドウが開きます。これを確認するには、コマンドプロンプトからstart /wait run-mariadb.batを実行します。コマンドを実行するための新しいウィンドウが開きます。

は単純であるためにあなたのコマンドの変更を検討:

dbServer.StartInfo.Arguments = "/c run-mariadb.bat"; 

はちょうど新しいコンソールプロセスを起動せずにコマンドを実行するには。

+0

ありがとう、それは私の以前の削除されたコメントを無視して、トリックを行ったようです。今、打ち上げは機能していますが、出力が得られませんが、実際にmariadbサーバーが稼働していることがわかります(私はそれに接続できます)。もう1つ、アプリ全体のUIが凍結しているようですが、それはwaitforexitの行のためですか?私は、隠しコンソールでサーバーを実行し、自分のRTBに出力をリダイレクトしようとしていますが、どうすればこの問題を解決できますか? – Latheesan

+0

はい、これをGUIスレッドで実行すると、GUIスレッドはロックされ、 'WaitForExit'行は完了を待ちます。あなたのフォームにdbServerへの参照を保持し、時々、 'HasExited'をチェックするか、' Exited'イベントにサインすることができます。 –

+0

「EnableRaisingEvents」を有効にする必要があるのですか? – Latheesan

関連する問題