5

私はスケジューラまたは並べ替えを書いています。これは基本的に、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 エージェントまたは Windows スケジューラを使用していません。彼の方が「経験」が多いので、基本的には命令に従ってるだけです。気軽に代替案を提案してください。

4

4 に答える 4

8

Win32Exceptionをキャッチして、ファイルが存在しないためにProcess.Start()が失敗したかどうか、または実行アクセスが拒否されたかどうかを確認できます。

ただし、このクラスを使用して作成したプロセスによってスローされた例外をキャッチすることはできません。そもそも、アプリケーションが .NET で書かれていない可能性があるため、例外の概念がまったくない可能性があります。

できることは、アプリケーションのExitCodeをチェックするか、 StandardOutputおよびStandardErrorストリームを読み取って、エラー メッセージがポストされているかどうかをチェックすることです。

于 2008-09-30T23:31:28.227 に答える
5

プロセスがそれを返すと仮定すると、Process.ExitCode を探していると思います。ただし、WaitForExit() を使用する必要がある場合があります。アプリが stderr に送信するときにトリガーされる ErrorDataReceived イベントもあります。

于 2008-09-30T23:20:15.243 に答える
2

ExitCode に加えて、次のようなこともできます。

string output = p.StandardOutput.ReadToEnd();

これにより、コマンド ウィンドウに書き込まれるすべてのものがキャプチャされます。次に、その文字列を解析して、アプリに応じてエラーを表示するための既知のパターンを見つけることができます。

于 2008-09-30T23:24:27.153 に答える
0

@joが言ったことを拡張する。また、プロセスが終了するまで待つ必要があります。したがって:

        p.Start();
        p.WaitForExit();
        int returnCode = p.ExitCode;

通常、ゼロ以外のコードはエラーです。一部のアプリケーションでは、負のものをエラーとして使用し、正のものをステータス コード/警告として使用します。

于 2008-10-01T10:55:59.223 に答える