0

C# WinForms アプリケーション (.NET 4)

ディレクトリ パスは、コンボ (ドロップダウン) メニューから選択され、次のコマンド ライン ステートメントに含まれます。

for %f in ("< path >\*.ocx" "< path >\*.dll") do regsvr32 /s "%f"

ここで、< パス >はディレクトリ パスです。

これはうまく実行されます。ユーザーが表示されるポップアップ/メッセージ ボックスに対して [OK] を何千回もクリックしなくても、登録成功メッセージ (またはエラー) を取得したいと考えています。明らかに、サイレント (/s) スイッチはポップアップを取り除きます。

ユーザーが画面に (アプリケーション自体以外に) 何も表示せずに結果を取得する最良の方法は何でしょうか?

これは私が今持っているものです。

public void reg_in_source_2()
{
    ProcessStartInfo cmdStartInfo = new ProcessStartInfo();
    cmdStartInfo.FileName = @"C:\Windows\System32\cmd.exe";
    cmdStartInfo.RedirectStandardOutput = true;
    cmdStartInfo.RedirectStandardError = true;
    cmdStartInfo.RedirectStandardInput = true;
    cmdStartInfo.UseShellExecute = false;
    cmdStartInfo.CreateNoWindow = true;

    Process cmdProcess = new Process();
    cmdProcess.StartInfo = cmdStartInfo;
    cmdProcess.ErrorDataReceived += cmd_Error;
    cmdProcess.OutputDataReceived += cmd_DataReceived;
    cmdProcess.EnableRaisingEvents = true;
    cmdProcess.Start();
    cmdProcess.BeginOutputReadLine();
    cmdProcess.BeginErrorReadLine();

    cmdProcess.StandardInput.WriteLine(@"for %%f in (""" + reference.source_folder + @"\*.ocx"" " + reference.source_folder + @"\*.dll"") do regsvr32 ""%%f""");
    cmdProcess.StandardInput.WriteLine("exit");

    cmdProcess.WaitForExit();
}

public void cmd_DataReceived(object sender, DataReceivedEventArgs e)
{
    reference.cmd_replies.Add(e.Data);
}

public void cmd_Error(object sender, DataReceivedEventArgs e)
{
    reference.cmd_replies_errors.Add(e.Data);
}
4

2 に答える 2

2

バッチ スクリプトを cmd プロセスに書き出す代わりに、 を使用Directory.GetFiles("c:\\somepath\\", "*.dll;*.ocx")して登録するファイルを取得し、 を使用してプロセスprocess.startを開始regsvr32し (/silent引数を使用)、リターン コードをチェックして、成功したかどうかを確認します。

スクリプトで実行しようとすると、目的の regsvr32 プロセスではなく、cmd プロセスのリターン コードのみが取得されます。

于 2013-03-11T16:09:54.813 に答える
1

Environment.Exit(code) を設定して、コンソール アプリケーションから終了コードを返してください。

このスタックオーバーフローの回答にリンクされているように終了コードを設定できます

デフォルト値は 0 (ゼロ) で、プロセスが正常に完了したことを示します。エラーを示すには、0 以外の数値を使用します。アプリケーションでは、列挙型で独自のエラー コードを定義し、シナリオに基づいて適切なエラー コードを返すことができます。

すべてのエラー コードにステータス メッセージをマップすることができ、これらのメッセージをログに記録できます。

于 2013-03-11T16:08:10.457 に答える