0

プログラムで一連のコマンドを実行し、エラーコードを読み取り、これらのコードが成功または失敗を示しているかどうかを検出して、それに応じて対応できるようにしようとしています。

現在、私のコマンドはpsexecを使用しており、psexecはrobocopyを起動します。プログラムが成功した場合、ほとんどのコマンドはエラーコード0を返しますが、robocopyは、操作が成功した場合でも0〜8の範囲の値を返すという点で奇妙であるため、ロジックを追加しています。 robocopyがエラーコードを返すときに注意するエラー検出。それ以外の場合は失敗を示唆します。

問題は、この同じコマンドセットで、PSExecを使用して他のさまざまな実行可能ファイルやバッチファイルを起動しているため、robocopyがこれらのエラーコードを返すのはいつか、またはPSExecであるかどうかを知ることができるエラー検出ソリューションが必要なことです。通常、robocopyのエラーコード5は問題ありませんが、PSExecのエラーコード5は、アクセスが拒否されたことを示しています。

だから私の質問は、どのプログラムがエラーコードを返したかをどうやって知るのですか?私はc#.NET 4.0を使用しており、Processクラスを使用してこれらのプログラムをプログラムで起動しています。プログラム名をpsexecとして設定し、引数にはrobocopyまたは他のプログラムが含まれています。次に、実行して終了を待ち、エラーコードを保存してから、解析を試みます。

皆さんは何を提案しますか?

コードスニペットは次のとおりです。

foreach (var command in commands)
        {
            // TODO: Add exception handling
            string processName = command.Split(delimiters).ToList().ElementAt(0);    // split up command into pieces, select first "token" as the process name
            string commandArguments = command.Replace(processName + " ", ""); // remove the process name and following whitespace from the command itself, storing it in a new variable
            Process commandProcess = new Process(); // declare a new process to be used
            commandProcess.StartInfo.FileName = processName;    // add file start info for filename to process
            commandProcess.StartInfo.Arguments = commandArguments;  // add file start info for arguments to process
            commandProcess.StartInfo.UseShellExecute = false;  // skip permissions request
            commandProcess.Start();   // start process according to command's data
            commandProcess.WaitForExit();   // wait for the process to exit before continuing
            bool commandSuccessful = ParseCommandErrorCode(commandProcess, commandProcess.ExitCode);    // grab error code
            if (!commandSuccessful)
            {
                // ERROR! abort operation and inform the user of the last completed operation, and how many commands have not been run
            } // end if
            Console.WriteLine("Error code: {0}", commandProcess.ExitCode);    // print error code
            commandProcess.Close(); // close process
        } // end foreach
4

2 に答える 2

0

大規模なデータベースのバックアップを行うため、コマンド ファイル .cmd があります。以下のように、a* b* c* c* などのプロセス スクリプト行ごとに mny Start ROBOCOPY コースの宛先と引数があります。例を以下に示します。 sample.cmd ファイルとして:

ROBOCOY 起動 src dest a* b* c* /z /w:1 r:1

ロボコイ起動 src dest d* e* f* g* /z /w:1 r:1

ロボコイ開始 src dest h* K* P* Y* /z /w:1 r:1

ROBOCOY 起動 src dest xry* srp* /z /w:1 r:1

私がラム> Robocopy sample.cmdを実行すると、cmd.exeと別の4つの複数のコンソールウィンドウrobooy.exeが上記のコマンドに従って同時にファイルをコピーし、ファイルが別のファイルによって使用されている場合、待機時間があるため、別のファイルを待ちます処理する。同時に仕事をするので、より高速です。

現在、コマンドコンソールに移動して開始する代わりに、C#ウィンドウを使用してプロセスを実行するGUIを作成しています

主要()

{

process.start( "sample.cmdのパス" )

process.waitforexit()

label.text="コピー成功"

}

ただし、1 つのプロセス、つまり cmd.exe を制御し、タスク マネージャーに 4 つの robocopy プロセスがある場合。cmd.exe プロセスが完了すると、カーソルが label.text "正常に完了しました" に戻ります。まだ実行中の robocopy プロセスがあります。コピー プロセスを実行している robocopy ウィンドウを確認できます。

質問は次のとおりです。C# ですべてのプロセス (cmd.exe および robocopy.exe) をプログラムで制御したいので、すべてのコマンドが正常に完了した場合にのみ、label.text が「正常に完了しました」と表示されるようにします。 1 つが失敗すると、GUI には意味がありません。

オプション 2 (上で Biju が書いたものと同様): sample.cmd(バッチ ファイル) ファイルから robocooy コマンド スクリプトを削除し、C# で 4 つの robocopy 行を実行するコードを記述した方がよいのですが、robocooy スクリプト行を実行する方法が書かれています。 cmd ファイルにも引数があるためです。コードは各 robocopy プロセスを実行し、それぞれが次のコード行に戻ります。失敗した場合は、エラーをキャッチしてメッセージ ボックスに表示できます。

これが役立つことを願っています...ただし、誰かが同じことを改善できる場合は、より良い方法を探しています。ありがとう :)

于 2013-09-03T07:07:13.347 に答える
0

あなた自身の質問にすでに答えていませんか?各ユーティリティの成功または失敗にエラー コードを一致させる必要があります。commandProcess.StartInfo.FileNameは、起動されたユーティリティがrobocopyまたはであるかどうかを示しますPSExe。エラー コードを解析するときは、ファイルの名前に応じて値を成功または失敗にマップします。

于 2010-07-07T18:32:08.383 に答える