このトピックに関する他の SO 記事のガイダンスに従っていますが、必要なものを見つけることができませんでした。この場合、既知の破損した .msi を起動する次のコードブロックがあります (標準エラー メッセージの取得をテストするため)。
ProcessStartInfo procStartInfo = new ProcessStartInfo("cmd.exe", "/c " + thirdPartyApp.Item2.InstallString);
procStartInfo.RedirectStandardOutput = true;
procStartInfo.RedirectStandardError = true;
procStartInfo.UseShellExecute = false;
procStartInfo.CreateNoWindow = true;
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo = procStartInfo;
writeEvent(EventLogEntryType.Information, "Attempting to launch upgrade: " + thirdPartyApp.Item2.InstallString, "Third Party Update");
proc.Start();
string stderror = proc.StandardError.ReadToEnd();
proc.WaitForExit();
手動で起動すると、この .msi はエラー コード 1620 をスローし、「このインストール パッケージを開けませんでした。アプリケーション ベンダーに連絡して、これが有効な Windows インストーラ パッケージであることを確認してください。」というメッセージが表示されます。
デバッグ中に proc.ExitCode を見ると、その値は 1620 であるため、正しくキャプチャされています。エラー テキストをキャプチャしようとする行を追加しましたstring stderror = proc.StandardError.ReadToEnd();
が、プロセスが実行されてエラーが発生した後、stderror の値は "" になります。
実際のエラー テキストを変数に取り込むにはどうすればよいですか?