Wie erkenne ich, welches Programm hat einen Fehlercode zurückgegeben?
-
02-10-2019 - |
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
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:)