.Net System.Diagnostics.Processが正常に実行されたか失敗したかをどのように確認できますか?
-
03-07-2019 - |
質問
スケジューラまたはソートを書いています。基本的には、exeのリスト(" C:\ a.exe"など)を持つテーブルと、1分ごとにテーブル内のレコードを調べて、まだ実行されていないタスクを実行するコンソールアプリです。
次のようなタスクを実行します:
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = someExe; // like "a.exe"
p.Start();
特定のタスクが失敗したかどうかを確認するにはどうすればよいですか?たとえば、a.exeが未処理の例外をスローした場合はどうなりますか?上記のコードでこれがいつ発生するかを知り、「特定のタスクが失敗しました」などのタスクテーブルを更新したいと思います。など。
これを行うにはどうすればよいですか
誰かが私にそうしないように言ったので、私はSql AgentまたはWindowsスケジューラを使用していません。彼はより多くの「経験」を持っています。だから私は基本的に注文に従っているだけです。代替案を提案してください。
解決
Win32Exception をキャッチして、 Process.Start()は、ファイルが存在しないか実行アクセスできないため失敗しました拒否されました。
ただし、このクラスを使用して作成したプロセスによってスローされた例外をキャッチすることはできません。そもそも、アプリケーションは.NETで記述されていない可能性があるため、例外の概念がまったくない可能性があります。
できることは、 ExitCode アプリケーションの StandardOutput および StandardError ストリームは、エラーメッセージかどうかを確認します投稿されています。
他のヒント
プロセスが返すものと仮定して、Process.ExitCodeを探していると思います。 ただし、WaitForExit()を使用する必要がある場合があります。アプリがstderrに送信するときにトリガーされるErrorDataReceivedイベントもあります。
ExitCodeに加えて、次のようなこともできます。
string output = p.StandardOutput.ReadToEnd();
これは、コマンドウィンドウに書き込まれるはずのすべてをキャプチャします。その後、アプリに応じて、エラーを表示するための既知のパターンについてその文字列を解析できます。
@jopの発言を詳しく説明します。また、プロセスが終了するまで待つ必要があります。したがって:
p.Start();
p.WaitForExit();
int returnCode = p.ExitCode;
非ゼロコードは通常エラーです。一部のアプリケーションでは、エラーをネガティブに使用し、ステータスコード/警告としてポジティブを使用しています。