كيف يمكنني اكتشاف البرنامج الذي أعاد رمز الخطأ؟

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 ابتداءً من مقصودات Cource Cource ووسائط كل سطر البرنامج النصي للعملية لـ* B* C* إلخ. sample.cmd file على النحو التالي:

ابدأ 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

عندما أقوم بـ Rum> robocopy sample.cmd ، أبدأ بـ cmd.exe و 4 وحدة تحكم أخرى متعددة Windows Robocoy.exe نسخ في وقت واحد وفقًا للأوامر أعلاه ، فهي تنتظر ملفًا آخر ، حيث يتم استخدام وقت الانتظار ، إذا تم استخدام الملف من قبل ملف آخر معالجة. هو أكثر أسرع لأنها تعمل في وقت واحد.

الآن أنا devloping واجهة المستخدم الرسومية باستخدام W Windows لتشغيل العملية بدلاً من ذلك سأذهب إلى وحدة التحكم والبدء

رئيسي()

{

Process.start ("Path of Sample.CMD")

process.Waitforexit ()

label.text = "Sucessful Copy"

}

ومع ذلك ، إذا كان الأمر سيطر على OneProcess ، أي cmd.exe وهناك 4 عمليات robocopy في TaskManager. عند اكتمال عملية cmd.exe ، فإنها تُرجع المؤشر إلى تسمية. في حين أن هناك عمليات روبوكية لا تزال قيد التشغيل. يمكنك رؤية نوافذ robocopy تقوم بعملية النسخ.

فيما يلي السؤال: أريد أن آخذ جميع العمليات (cmd.exe و robocopy.exe) برمجيًا في C#، بحيث عندما يتم إكمال الملصق ". يفشل المرء ، ثم لا توجد فائدة في واجهة المستخدم الرسومية.

الخيار 2 (على غرار BIJU قد كتب أعلاه): هل من الأفضل إزالة البرامج النصية لأمر Robocoy من ملف Sample.CMD (ملف الدُفعات) وكتابة رمز لتشغيل 4 خطوط Robocopy في C#، ولكن كيفية تشغيل خط البرنامج النصي Robocooy المكتوب. ملف CMD ، لأن لديهم حجج أيضًا. أقوم بتشغيل رمز كل عملية روبوكية ، ثم سيعود كل منها إلى السطر التالي من التعليمات البرمجية وإذا فشل ، فيمكننا التقاط الخطأ والعرض في مربع الرسالة.

آمل أن يساعد هذا ... ومع ذلك ، أنا أبحث عن طريقة أفضل ، إذا كان شخص ما يمكن أن يتحسن على نفسه. شكرًا :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top