Как обнаружить, какая программа вернула код ошибки?
-
02-10-2019 - |
Вопрос
Я пытаюсь запустить серию команд программно, прочитайте коды ошибок и обнаруживают, указывают, что эти коды указывают на успех или сбой, поэтому я могу ответить соответственно.
В настоящее время мои команды используют 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, затем каждый вернется к следующей строке кода, и если она не удается, мы можем завершить ошибку и отобразить в окне сообщения.
Надеюсь, это поможет ... Тем не менее, я ищу более лучшим способом, если кто-то может улучшить на том же. Спасибо :)