سؤال الحصول على ROBOCOPY لإرجاع رمز الإنهاء "المناسب"؟


هل من الممكن أن تطلب من ROBOCOPY الخروج برمز خروج يشير إلى النجاح أم الفشل؟

أستخدم ROBOCOPY كجزء من تكوينات TeamCity الخاصة بي ، ويجب أن أضيف خطوة لإخفاء رمز الخروج من ROBOCOPY يبدو سخيلاً بالنسبة لي.

في الأساس ، لقد أضفت هذا:

EXIT /B 0

إلى البرنامج النصي الجاري تشغيله.

ومع ذلك ، فإن هذا بالطبع يخفي أي مشاكل حقيقية قد تعود ROBOCOPY.

في الأساس ، أود الحصول على رموز خروج من 0 لـ SUCCESS وغير صفرية لـ FAILURE بدلاً من قناع البت الذي تقوم ROBOCOPY بإرجاعه الآن.

أو ، إذا لم أتمكن من الحصول على ذلك ، فهل هناك تسلسل بسيط لأوامر الدفعية التي من شأنها أن تترجم قناع بت ROBOCOPY إلى قيمة مماثلة؟


111
2018-05-07 13:03


الأصل


تجدر الإشارة أيضًا إلى أن رموز الإنهاء الثمانية الأولى (0-7) ليست حالات خطأ على ما يبدو: stackoverflow.com/questions/16533843/psake-and-robocopy-failing - longda


الأجوبة:


حسب هنا، يحتوي Robocopy على قطع رمز إنهاء التالية التي تشكل رمز الإنهاء:

0 × 10 خطأ فادح. لم نسخ Robocopy أي ملفات. هذا إما خطأ في الاستخدام أو خطأ بسبب امتيازات الوصول غير كافية في دلائل المصدر أو الوجهة.

0 × 08 تعذر نسخ بعض الملفات أو الدلائل (حدثت أخطاء النسخ وتم تجاوز حد إعادة المحاولة). تحقق من هذه الأخطاء أكثر.

0 × 04 تم اكتشاف بعض الملفات أو الدلائل غير المتطابقة. افحص سجل الإخراج. من المحتمل أن يكون التدبير المنزلي ضروريًا.

0 × 02 تم اكتشاف بعض الملفات أو الدلائل الإضافية. افحص سجل الإخراج. قد تكون هناك حاجة بعض التدبير المنزلي.

0 × 01 تم نسخ ملف واحد أو أكثر بنجاح (أي ، وصلت ملفات جديدة).

0 × 00 لم تحدث أي أخطاء ، ولم يتم إجراء نسخ. تتم مزامنة أشجار دليل المصدر والوجهة بشكل كامل.

ما عليك سوى إضافة العبارات / غير ذلك EXIT /B 0 عندما تكون قيمة الإرجاع 1 أو ربما 0 و EXIT /B 1 غير ذلك. حتى لو كان قد تم نسخ الملفات ، فهناك شيء خاطئ قد يحتاج إلى تدخل يدوي.


43
2018-05-07 13:34





يقترح TechNet هذا واحد في خط واحد لتحويل رمز الخروج إلى رمز خروج أكثر تقليدية:

(robocopy c:\dirA c:\dirB *.*) ^& IF %ERRORLEVEL% LEQ 1 exit 0

أو هذا لتجاهل رمز الخروج تمامًا (أي لا يهمك إذا فشلت أو نجحت):

(robocopy c:\dirA c:\dirB *.*) ^& exit 0

ومع ذلك ، سيقوم كلا الأمرين أعلاه بإنهاء برنامج نصي بعد تنفيذ عملية النسخ. هذه مشكلة خاصة لـ CI builds. إذا كنت تريد استخدام robocopy في هذا السيناريو ، فستحتاج إلى تعيين رمز الخطأ يدويًا للحصول على رموز إنهاء غير ملائمة. أدناه ، سيتم إعادة كتابة جميع رموز الخطأ أدناه 8 إلى أي خطأ على الإطلاق ، وسوف يستمر البرنامج النصي إذا أمكن ذلك.

(robocopy c:\dirA c:\dirB *.*) ^& IF %ERRORLEVEL% LSS 8 SET ERRORLEVEL = 0

93
2018-06-18 05:26



لطيف. يحتاج الأقواس حول الأمر robocopy ، ولكن حفظ لي باستخدام برنامج الالتفاف النصي. - TheCodeKing
لم أستطع الحصول على هذا الخط الواحد للعمل كخطوة بناء سطر الأوامر في TeamCity. اضطررت إلى نقله إلى خط منفصل. أضفت أيضًا الوسيطة / B إلى أمر exit ، على الرغم من أنني لا أعتقد أن ذلك مطلوب. - MikeWyatt
لنشر Teamcity (وليس Teamcity فقط) ، من المفيد كتابة: IF %ERRORLEVEL% LEQ 3 set errorlevel=0 وعلى السطر التالي: if %errorlevel% neq 0 exit /b %errorlevel% (إذا كان الملف الدفعي يتكون من عدة عمليات ، وليس فقط robocopy) ، لأن رموز OK أقل من 3. ss64.com/nt/robocopy-exit.html - DaoCacao
في TeamCity ، يجب عليك الهروب من ERRORLEVEL مع ٪٪٪ ، مثل هذا: ٪٪ ERRORLEVEL ٪٪. خلاف ذلك ، فإنه يعتبر أن تكون معلمة بناء TeamCity. - Yan Sklyarenko
ماذا يكون ال ^& فعل؟ ss64 يقول يهرب ولكن يبدو لي أنه لا ينبغي أن نجا من؟ - mlhDev


تشغيله من Jenkins يحتاج على حد سواء ( ) و /B. إذا كنت تريد تجاهل مستوى الخطأ 1 ، 2 ، 3 ، 4:

(robocopy XXX YYY) ^& IF %ERRORLEVEL% LEQ 4 exit /B 0

17
2018-05-07 13:35



قد يكون LSS 8 أفضل :) - Ivan


من عند هذه الصفحة يمكنك إضافة قسم إلى ملف الدُفعات الخاص بك يستخدم قائمة أكواد الخطأ لإخراج الأخطاء وتشغيل مقاطع تعليمات برمجية مختلفة:

if %ERRORLEVEL% EQU 16 echo ***FATAL ERROR*** & goto end
if %ERRORLEVEL% EQU 15 echo OKCOPY + FAIL + MISMATCHES + XTRA & goto end
if %ERRORLEVEL% EQU 14 echo FAIL + MISMATCHES + XTRA & goto end
if %ERRORLEVEL% EQU 13 echo OKCOPY + FAIL + MISMATCHES & goto end
if %ERRORLEVEL% EQU 12 echo FAIL + MISMATCHES& goto end
if %ERRORLEVEL% EQU 11 echo OKCOPY + FAIL + XTRA & goto end
if %ERRORLEVEL% EQU 10 echo FAIL + XTRA & goto end
if %ERRORLEVEL% EQU 9 echo OKCOPY + FAIL & goto end
if %ERRORLEVEL% EQU 8 echo FAIL & goto end
if %ERRORLEVEL% EQU 7 echo OKCOPY + MISMATCHES + XTRA & goto end
if %ERRORLEVEL% EQU 6 echo MISMATCHES + XTRA & goto end
if %ERRORLEVEL% EQU 5 echo OKCOPY + MISMATCHES & goto end
if %ERRORLEVEL% EQU 4 echo MISMATCHES & goto end
if %ERRORLEVEL% EQU 3 echo OKCOPY + XTRA & goto end
if %ERRORLEVEL% EQU 2 echo XTRA & goto end
if %ERRORLEVEL% EQU 1 echo OKCOPY & goto end
if %ERRORLEVEL% EQU 0 echo No Change & goto end


:END
REM END OF BATCH FILE

13
2018-05-07 14:54





انا استعمل هذا:

robocopy .....
call :REPORT_ERRORLEVEL
goto :EOF

:REPORT_ERRORLEVEL
echo.
if ERRORLEVEL 16 echo ***FATAL ERROR*** & goto :EOF
if ERRORLEVEL 8 echo **FAILED COPIES** & goto :EOF
if ERRORLEVEL 4 echo *MISMATCHES* & goto :EOF
if ERRORLEVEL 2 echo EXTRA FILES & goto :EOF
if ERRORLEVEL 1 echo Copy successful & goto :EOF
if ERRORLEVEL 0 echo –no change– & goto :EOF

8
2018-04-03 23:56





لقد غاب عن بعض الملصقات الموجودة أعلاه دقة قناع البت. وقد غاب عن paradroid خاصة أن errorlevel 3 يشير إلى نسخة ناجحة تماما.

لاحظ أن bit 0x01 إذا تم تعيينها تشير إلى أنه قد تم نسخ بعض الملفات حتى في حالة حدوث حالات فشل أخرى. لذلك ، يشير أي خطأ خطي فردي إلى أن بعض الملفات على الأقل قد تم نسخها. لاحظ أيضًا أن bit 0x02 تشير ببساطة إلى وجود ملفات في الوجهة غير موجودة عند المصدر. سيحدث هذا إذا تم استخدام رمز التبديل / E وتم حذف الملفات من المصدر منذ أخذ نسخة سابقة. لا ينبغي أن يحدث إذا تم استخدام رمز التبديل / MIR لأن ذلك يجب أن يحذف الملفات في الوجهة لمراعاة المصدر (لكنني لم اختبر هذا).

لذلك ، يشير كل من errorlevel 1 و 3 إلى النسخ الناجح للملفات دون أخطاء. كما يشير الخطأ 0 و 2 إلى أن الوجهة محدثة ولم يتم نسخ أي ملفات.

لما قيمته ، توصلت إلى ما يلي للنسخ الاحتياطي البسيط:

إذا فشل errorlevel 16 echo Backup - راجع السبب أعلاه & goto done

إذا كان errorlevel 8 صدى كل ما هو غير جيد - احتياطية غير مكتملة و goto القيام به

إذا كان errorlevel 4 صدى كل شيء ليس على ما يرام - بعض الملفات غير متطابقة و goto القيام به

إذا كان errorlevel 3 echo تم إكمال عملية النسخ الاحتياطي بنجاح و goto

إذا كان errorlevel 2 echo النسخ الاحتياطي بالفعل حتى الآن - لا توجد ملفات منسوخة & goto القيام به

إذا كان errorlevel 1 echo تم إكمال عملية النسخ الاحتياطي بنجاح و goto

إذا كان errorlevel 0 صدى النسخ الاحتياطي بالفعل حتى الآن - لا توجد ملفات منسوخة & goto القيام به

اخترت عدم إزعاج الملفات "الإضافية".

ليس لدي أي فكرة عن الخطأ "غير متطابق" لأنه لم يحدث بعد لكني سمحت به فقط في حالة.


8
2017-10-24 03:36





أتفق مع Guest John - فأنت تريد فقط أن تشير إلى خطأ إذا كانت النتيجة 8 أو أعلى.

إذا قمت بتعيين نتيجة robocue إلى 0 (نجاح) أو نتيجة 1 (فشل) ، مناسبة للاستخدام في مهمة عميل SQL ، أستخدم هذا:

  IF %ERRORLEVEL% LSS 8 EXIT /B 0
  EXIT /B 1

6
2018-02-05 01:01





بالنسبة لفريق TeamCity ، أستخدم هذا ويعمل بشكل جيد. بفضل المدخلات من MikeWyatt ، DaoCacao ، ويان Sklyarenko. أنا فقط بحاجة لرؤية مثال كامل للعمل للمساعدة في تصور الإجابة.

(robocopy  .\Artifacts\Fitnesse %FitDestinationFolder% /MIR)
IF %%ERRORLEVEL%% LEQ 3 set errorlevel=0
IF %%ERRORLEVEL%% NEQ 0 EXIT /b %%ERRORLEVEL%%
EXIT 0

2
2018-06-21 23:49



إنني أستخدم نص برمجي مماثل في حدث POST-BUILD .. لذلك يتم نسخ المكتبات التابعة إلى مشروع التطبيق exe المستهلك - والذي يشار إليه فقط من خلال نمط محدد موقع control / control / control. - bkwdesign


مثال هنا على كيفية نسخ الملفات النهائية من Visual Studio 2010 + إلى مجلد آخر كما يتوقع Visual Studio 0 لا 1 على نسخة جيدة.

cmd /c (robocopy $(TargetDir) X:\$(TargetName) $(TargetFileName) $(TargetFileName).config *.dll *.json *.xml /xx) ^& IF %ERRORLEVEL% LEQ 1 exit 0 

0
2017-11-08 22:20