Frage

Ich bin versucht, eine Reihe von Befehlen programmatisch ausgeführt werden, die Fehlercodes lesen und erkennen, ob diese Codes Erfolg oder Misserfolg zeigen, damit ich entsprechend reagieren zu können.

Zur Zeit meine Befehle verwenden psexec die dann startet robocopy. Ich habe festgestellt, dass die meisten Befehle einen Fehlercode von 0 zurück, wenn das Programm erfolgreich ist, Robocopy in ungerade ist, dass es Werte im Bereich von 0-8 zurück, auch wenn die Operation erfolgreich ist, so dass ich einige zusätzliche Logik bin Zugabe in meine Fehlererkennung zu beachten, wenn robocopy einen Fehlercode zurück, die sonst einen Fehler vermuten läßt.

Das Problem ist, dass in diesem gleichen Befehlssatz I PSExec bin mit verschiedenem anderen ausführbaren Dateien und Batch-Dateien zu starten, so brauche ich eine Fehlererkennungslösung, die mir erlaubt, zu wissen, wann Robocopy derjenige ist, die Rückkehr dieser Fehlercodes oder wenn es ist PSExec weil ein Fehlercode von 5 in robocopy fein in der Regel während ein Fehlercode von 5 in PSExec ist, sagt, dass der Zugriff verweigert wird.

Also meine Frage ist, wie kann ich wissen, welches Programm den Fehlercode zurückgegeben hat? Ich verwende c # .NET 4.0, und ich bin mit der Process-Klasse programmatisch diese Programme zu starten. Ich stellte den Programmnamen als psexec und die Argumente sind die Robocopy oder andere Programme. Ich habe dann laufen, Warten auf den Ausgang, und speichern Sie den Fehlercode, dann versuchen, es zu analysieren.

Was tun Sie alle vorschlagen?

Hier ist ein Code-Snippet:

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
War es hilfreich?

Lösung

Haben Sie nicht bereits Ihre eigene Frage beantwortet? Sie werden den Fehlercode zu Erfolg oder Misserfolg für jedes Dienstprogramm übereinstimmen müssen. commandProcess.StartInfo.FileName werden Ihnen sagen, wenn das Dienstprogramm gestartet ist robocopy oder PSExe. Wenn der Fehlercode Parsen, Karte den Wert auf Erfolg oder Misserfolg in Abhängigkeit von dem Namen der Datei.

Andere Tipps

ich Sicherung großer Datenbank, so dass es eine .cmd-Befehlsdatei ist. dass ich mny starten ROBOCOPY cource Ziel und Argumente jeder Prozess Skriptzeile für a * b * c * c * usw. Beispiel wie folgt: in sample.cmd Datei (fungiert als btach Datei), Ich habe folgende Zeilen von Skripten in einer sample.cmd Datei:

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

Start ROBOCOY src dest d * e * f * g * / z / w: r 1: 1

Start ROBOCOY src dest h * K * P * Y * / z / w: r 1: 1

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

Wenn ich Rum> Robocopy sample.cmd I beginnt mit cmd.exe und weitere 4 mehrere Konsolenfenster robocoy.exe das Kopieren von Dateien gleichzeitig nach oben Befehle, wartet sie auf eine andere Datei, wie es Wartezeit hat, wenn die Datei Wesen von einem anderen Prozess verwendet. Ist ist schneller als es Arbeit zu tun gleichzeitig.

Jetzt bin ich GUI entwickelnde C # Fenster unter Verwendung des Prozesses statt laufen, um Befehlskonsole gehen und Start

main ()

{

Process.Start ( "Weg der sample.cmd")

process.waitforexit ()

Label.text = "sucessful copy"

}

Wenn es jedoch die Kontrolle über oneprocess nimmt, das heißt cmd.exe und und es gibt 4 Robocopy Prozesse in Taskmanager. wenn cmd.exe Prozess abgeschlossen ist, es den Cursor auf Label.text gibt „Sucesssfully abgeschlossen“. Während es läuft Robocopy Prozesse noch. Sie können die Robocopy Fenster machen den Kopiervorgang sehen.

Hier ist die Frage: Ich möchte alle nehmen contrl die Prozesse (cmd.exe und robocopy.exe) programatically in C #, dass so, wenn die Label.text solle „erfolgreich abgeschlossen“ wird nur angezeigt, wenn alle Befehle erfolgreich abgeschlossen “wenn einer ausfällt, dann gibt es keinen Punkt in der GUI.

Option 2 (ähnlich Biju hat geschrieben oben): ist es besser, robocoy Befehlsscripts aus sample.cmd (Batch-Datei) Datei und Schreibcode ausführen, um die 4 Robocopy Linien in C # zu entfernen, aber wie das robocooy Skript auszuführen Linie .cmd-Datei geschrieben, da sie Argumente als auch haben. I-Code läuft jeder Robocopy Prozess jeder zurückkehren wird auf die nächste Zeile des Codes dann und wenn es fehlschlägt, können wir den Fehler und die Anzeige im Meldungsfeld fangen.

Hope Dies wird helfen ... Allerdings sucht Iam für mehr bessere Art und Weise, wenn jemand auf dem gleichen verbessern kann. Danke:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top