web-dev-qa-db-ja.com

Process.Start()が成功したかどうかを知る方法は?

プロセスを開始するために2つの異なる方法を試しました。

最初の

定義は、Startメソッドのパラメーターとして定義されます。

System.Diagnostics.Process.Start("Excel", string.Format("\"{0}\"", ExcelFileBox.Text.ToString()));

私の考え:

これは問題なく始まりますが、フィードバックを得る方法がわかりません。

2番目

Excelが正常に起動したかどうかを知りたいので、ProcessStartInfoを調べ始めました。たとえば、Excelはユーザーのマシンに存在する可能性が非常に高いですが、保証はなく、指示するのはばかげています正常に起動しなかったユーザー。

System.Diagnostics.ProcessStartInfo startinfo = new System.Diagnostics.ProcessStartInfo
            {
                FileName = "Excel",
                Arguments = string.Format("\"{0}\"", ExcelFileBox.Text.ToString()),
                ErrorDialog = true,
                UseShellExecute = false,
                WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
            };

            try
            {
                System.Diagnostics.Process.Start(startinfo);
            }
            catch (Exception err)
            {
                Console.WriteLine(err.Message);
            }

私の考え:

これにより、「指定されたファイルが見つかりません」というエラーが発生しますが、それがExcelアプリケーションなのか私のファイルなのかは不明です。いずれにせよ、私はエラーメッセージの能力に感謝しますが、現時点では受け取るべきではありません。

これが成功したかどうかを知る方法についての考え、提案、アイデア?

解決済み

プロセスを開始する最初の方法をtry-catchに入れましたが、これは見事に機能します。

24
emragins

Process.Start() のMSDNページには、このメソッドには戻り値が意味するブール型のオーバーロードがあることが記載されています。

プロセスリソースが開始されている場合はtrue。新しいプロセスリソースが開始されない場合(たとえば、既存のプロセスが再利用される場合)はfalse。

さらに、次の3つの例外をスローできます。

  • InvalidOperationException

ProcessコンポーネントのStartInfoにファイル名が指定されていません。

-または-

ProcessStartInfo.RedirectStandardInput、ProcessStartInfo.RedirectStandardOutput、またはProcessStartInfo.RedirectStandardErrorがtrueの場合、StartInfoプロパティのProcessStartInfo.UseShellExecuteメンバーはtrueです。

  • Win32Exception

関連ファイルを開く際にエラーが発生しました。

  • ObjectDisposedException

プロセスオブジェクトは既に破棄されています。


Process.Start()のこのオーバーロード(メソッドの唯一の非静的オーバーロード)を使用するには、ProcessStartInfoオブジェクトを使用してProcessクラスのインスタンスを作成する必要があります。

以下に例を示します。

ProcessStartInfo processStartInfo = new ProcessStartInfo("Excel.EXE");

Process process = new Process();
process.StartInfo = processStartInfo;
if (!process.Start())
{
    // That didn't work
}

ただし、これでもまだスローされる可能性があるので、静的な.Start()メソッド呼び出しの1つにキャッチをラップする方がおそらく良いでしょう。


それを考えると、Process.Start()の呼び出しが機能するかどうかは明らかであり、0(またはスローされている例外)の戻り値からこれを判断できます。

プロセスが開始されると、HasExitedなどのProcessクラスのプロパティを使用して、プロセスの状態を確認できるようになり、物事を多く制御できます。

要するに、ユーザーのマシンにExcelがない場合、Process.Start()は例外をスローします。

18
David Hall

Process.ExitCode のプロパティ0success)value。

5
Mark Cidade

Process.Start()は、既存のプロセスを取得したか、新しいプロセスが開始されたかを知らせるブール値も返します。

さらに、プロセスのProcessIdをチェックして、プロセスが開始/実行中であることを確認できます。何かのようなもの:

bool started = False;
Process p = new Process();
p.StartInfo = YourStartInfo;
started = p.Start();

try {
  int procId = p.Id;
}
catch(InvalidOperationException){
  started = False
}
catch(Exception ex) {
  started = False
}
4
Trevor Abell

プロセスが実際に開始したかどうかを正確に判断するために、プロセスIDを見つけようとしました。プロセスIDが見つかった場合、キャッチを入力してデバッグステートメントを出力するプロセスIDが見つからなかった場合は続行します。

            try
            {
                 bool pathExists = File.Exists(module.ExecutionPath);
                 if (pathExists)
                 {
                     ProcessStartInfo startArgs = new ProcessStartInfo();
                     startArgs.FileName = "C:\Windows\System32\notepad.exe";
                     startArgs.Arguments = null;

                     Process process = new Process();
                     process.StartInfo = startArgs;
                     process.Start();

                    Process startedProcess = CheckIfProcessStarted(process);
                 }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message + "  " + ex.InnerException);
                Debug.WriteLine("Couldnt find the process so it never ran");
            }

            private Process CheckIfProcessStarted(Process process)
            {
                return Process.GetProcessById(process.Id);
            }
0
Craig Martin