Как обнаружить, какая программа вернула код ошибки?

StackOverflow https://stackoverflow.com/questions/3197682

Вопрос

Я пытаюсь запустить серию команд программно, прочитайте коды ошибок и обнаруживают, указывают, что эти коды указывают на успех или сбой, поэтому я могу ответить соответственно.

В настоящее время мои команды используют PSExec, которые затем запускают Robocopy. Я отметил, что, хотя большинство команд возвращают код ошибки 0, если программа успешна, Robocopy нечетной в том, что она возвращает значения в диапазоне 0-8, даже если операция успешна, поэтому я добавляю некоторую дополнительную логику в Обнаружение моей ошибки, чтобы обратить внимание, когда Robocopy возвращает код ошибки, который в противном случае предлагает сбой.

Проблема в том, что в этом же наборе команд я использую PSEXEC для запуска различных других исполняемых файлов и пакетных файлов, поэтому мне нужно решение обнаружения ошибок, которое позволяет мне знать, когда Robocopy является тем, кто возвращает эти коды ошибок, потому что это PSExec, потому что Код ошибки 5 в Robocopy - это нормально, тогда как код ошибки 5 в PSExec говорит, что доступ запрещен.

Итак, мой вопрос, как я узнаю, какая программа вернула код ошибки? Я использую C # .NET 4.0, и я использую класс процесса, чтобы программно запустить эти программы. Я устанавливаю имя программы в виде PSExec, а аргументы включают в себя робокопию или другие программы. Затем я бегу, дождитесь выхода и сохраните код ошибки, затем попытаетесь проанализировать его.

Что вы все предложите?

Вот кодовый фрагмент:

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
Это было полезно?

Решение

Вы уже не ответили на свой вопрос? Вам придется сопоставить код ошибки к успеху или сбою для каждой утилиты. commandProcess.StartInfo.FileName скажу вам, если утилита запущена robocopy или PSExe. Отказ При расстановке кода ошибки отобразите значение успеха или сбоя в зависимости от имени файла.

Другие советы

Я делаю резервную копию большой базы данных, поэтому есть командный файл .CMD. В том, что у меня есть MNY Start Robocopy Cource Cource назначения и аргументы каждой линии сценарии процесса для A * B * C * C * и т. Д. Пример: в файле whumb.cmd (действует как файл btach), у меня следующие строки скриптов в образец файла ascmd как:

Начать RoboCoy SRC DEST A * B * C * / Z / W: 1 R: 1

Запустите RoboCoy SRC DEST D * E * F * G * / Z / W: 1 R: 1

Начать RoboCoy SRC DEST H * K * P * Y * / Z / W: 1 R: 1

Запустите RoboCoy SRC DEST XRY * SRP * / Z / W: 1 R: 1

Когда я ром> образец Robocopy.cmd я начинаю с cmd.exe и еще 4 множественных консольных Windows RoboCoy.exe файлов копирования копирования в соответствии с указанными выше командами, он ждет другого файла, так как он имеет время ожидания, если файл используется другим обработать. Это быстрее, поскольку он делает работу одновременно.

Теперь я DEVLOPING GUI, используя C # Windows, чтобы запустить процесс, вместо которого будет команда консоли и начать

основной()

{

Process.Start («Путь образец. CMD»)

Процесс .waitforexit ()

label.text = "Sucessful Copy"

}

Однако, если требуется контроль над однопроцессором, т.е. cmd.exe и и есть 4 процесса Robocopy в Taskmanager. Когда процесс CMD.EXE завершится, он возвращает курсор на Lablet.Text «Sucesssulous, выполненно». Хотя есть процессы Robocopy, все еще бегают. Вы можете увидеть окна Robocopy, выполняющие процесс копирования.

Вот вопрос: я хочу сделать CONTLE все процессы (CMD.exe и Robocopy.exe), программно в C #, чтобы, когда лейбл. Text должен отображать «успешно завершено» только тогда, когда все команды успешно выполнены », если Один терпит неудачу, то в графическом графике нет смысла.

Вариант 2 (похожее на Biju написал выше): Лучше удалить командные сценарии Robocoy из файла Whumb.cmd (Batch файла) и записывать код для запуска 4 Robocopy линий в C #, но как запустить пишущую строку скрипта Robocooy. CMD файл, как у них есть аргументы. Код I CODE запускает каждый процесс Robocopy, затем каждый вернется к следующей строке кода, и если она не удается, мы можем завершить ошибку и отобразить в окне сообщения.

Надеюсь, это поможет ... Тем не менее, я ищу более лучшим способом, если кто-то может улучшить на том же. Спасибо :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top