Question

Je tente d'exécuter une série de commandes par programme, lisez les codes d'erreur et détecter si ces codes indiquent le succès ou l'échec pour que je puisse réagir en conséquence.

À l'heure actuelle mes commandes utilisent psexec qui lance alors ROBOCOPY. Je l'ai noté que, bien que la plupart des commandes renvoient un code d'erreur de 0 si le programme est un succès, robocopy est étrange en ce qu'elle renvoie des valeurs dans la plage de 0-8, même si l'opération est réussie, donc je suis une logique supplémentaire ajoutais dans ma détection d'erreur à la note lors du retour robocopy un code d'erreur qui indique le contraire un échec.

Le problème est que dans ce même ensemble de commandes que je utilise PSExec pour lancer divers autres exécutables et les fichiers batch, donc je besoin d'une solution de détection d'erreur qui me permet de savoir quand robocopy est le retour de ces codes d'erreur ou si il est PSExec parce qu'un code d'erreur de 5 à robocopy est bien souvent alors un code d'erreur de 5 à PSExec dit que l'accès est refusé.

Alors, ma question est, comment puis-je savoir quel programme a renvoyé le code d'erreur? J'utilise c # .NET 4.0, et j'utilise la classe Process pour lancer ces programmes par programme. Je mets le nom du programme psexec, et les arguments incluent robocopy ou d'autres programmes. Je puis courir, attendre la sortie, et stocker le code d'erreur, puis essayez de l'analyser.

Qu'est-ce que vous suggérez tous?

Voici un extrait de code:

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
Était-ce utile?

La solution

ne vous ai pas déjà répondu à votre question? Vous devez faire correspondre le code d'erreur de succès ou l'échec de chaque utilitaire. commandProcess.StartInfo.FileName vous dira si l'utilitaire lancé était robocopy ou PSExe. Lors de l'analyse du code d'erreur, la carte la valeur de la réussite ou de l'échec en fonction du nom du fichier.

Autres conseils

Je fais la sauvegarde de base de données importante, donc il y a un .cmd fichier de commandes. dans ce que je MNY Démarrer ROBOCOPY destination cource et les arguments de chaque ligne de script de processus pour a * b * c * c * etc. exemple, comme suit: dans le fichier sample.cmd (agit comme btach fichier), Je suit des lignes de scripts dans un fichier sample.cmd comme:

Début ROBOCOY src dest a * b * c * / z / w: r 1: 1

Début de ROBOCOY dest d * e * f * g * / z / w: r 1: 1

Début de ROBOCOY dest h * K * P * Y * / z / w: r 1: 1

Début de ROBOCOY dest XRY * * srp / z / w: r 1: 1

Quand je rhum> Robocopy sample.cmd Je commence par cmd.exe et un autre 4 plusieurs fenêtres de console robocoy.exe copie des fichiers simultanément comme ci-dessus les commandes, il attend un autre fichier, car il a le temps d'attente, si le fichier est être utilisée par un autre processus. Est-ce est plus rapide car il faire le travail en même temps.

Maintenant, je suis devloping utilisant l'interface graphique de Windows C # pour exécuter le processus d'aller à la place à la console de commande et  commencer

main ()

{

Process.Start ( "chemin de sample.cmd")

process.waitforexit ()

Label.text = "copy sucessful"

}

Cependant, si elle prend le contrôle de oneprocess, i.e. cmd.exe et et il y a 4 processus robocopy dans taskmanager. lorsque le processus cmd.exe finalise, il retourne le curseur sur Label.text « Sucesssfully terminé ». Bien qu'il existe des processus en cours d'exécution robocopy encore. vous pouvez voir les fenêtres de robocopy faire le processus de copie.

Voici la question: je veux prendre contrl de tous les processus (cmd.exe et Robocopy.exe) programatically en C #, de sorte que lorsque l'Label.text doit afficher « terminé avec succès » que lorsque toutes les commandes sont terminées avec succès », si l'on échoue, alors il n'y a pas de point dans l'interface graphique.

option 2 (similaire à Biju a écrit ci-dessus): est-il préférable de supprimer des scripts de commande robocoy de fichier sample.cmd (fichier batch) et le code d'écriture pour exécuter les 4 lignes de robocopy en C #, mais comment exécuter le script robocooy ligne écrite .cmd, car ils ont des arguments aussi bien. le code I exécute chaque processus de robocopy alors chacun retournera à la ligne de code suivante et si elle échoue, nous pouvons attraper l'erreur et l'affichage dans la boîte de message.

Espérons que cela aide ... Cependant, Iam la recherche de façon plus mieux, si quelqu'un peut améliorer la même chose. Merci:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top