"उचित" निकास कोड वापस करने के लिए ROBOCOPY प्राप्त करना


121

क्या ROBOCOPY से बाहर निकलने के कोड से बाहर निकलना संभव है जो सफलता या विफलता को इंगित करता है?

मैं ROBOCOPY का उपयोग अपने TeamCity बिल्ड कॉन्फ़िगरेशन के हिस्से के रूप में कर रहा हूं, और ROBOCOPY से बाहर निकलने के कोड को चुप करने के लिए एक कदम जोड़ने के लिए मुझे मूर्खतापूर्ण लगता है।

असल में, मैंने इसे जोड़ा है:

EXIT /B 0

जो स्क्रिप्ट चल रही है।

हालाँकि, यह निश्चित रूप से किसी भी वास्तविक समस्याओं का सामना करता है जो ROBOCOPY वापस आ जाएगी।

मूल रूप से, मैं ROBOCOPY अब वापस आने वाले बिट-मास्क के बजाय SUCCESS के लिए 0 से बाहर निकलें और FAILURE के लिए गैर-शून्य होना चाहूंगा।

या, अगर मेरे पास ऐसा नहीं हो सकता है, तो क्या बैच कमांड का एक सरल अनुक्रम है जो एक समान मूल्य पर ROBOCOPY के बिट-मास्क का अनुवाद करेगा?


2
यह भी ध्यान दिया जाना चाहिए कि पहले 8 एग्जिट कोड (4-7) स्पष्ट रूप से त्रुटि वाले राज्य नहीं हैं: stackoverflow.com/questions/16533843/psake-and-robocopy-failing
longda

जवाबों:


47

यहाँ के अनुसार , रोबोकॉपी में निम्नलिखित निकास कोड बिट्स हैं जो निकास कोड बनाते हैं:

0 × 10 गंभीर त्रुटि। रोबोकॉपी ने किसी भी फाइल की नकल नहीं की। यह स्रोत या गंतव्य निर्देशिकाओं पर अपर्याप्त पहुंच विशेषाधिकारों के कारण उपयोग त्रुटि या त्रुटि है।

0 × 08 कुछ फ़ाइलों या निर्देशिकाओं की प्रतिलिपि नहीं बनाई जा सकी (प्रतिलिपि त्रुटियां हुईं और पुन: प्रयास की सीमा पार हो गई)। इन त्रुटियों को और जांचें।

0 × 04 कुछ बेमेल फ़ाइलों या निर्देशिकाओं का पता लगाया गया था। आउटपुट लॉग की जांच करें। हाउसकीपिंग शायद आवश्यक है।

0 × 02 कुछ अतिरिक्त फ़ाइलों या निर्देशिकाओं का पता लगाया गया। आउटपुट लॉग की जांच करें। कुछ हाउसकीपिंग की जरूरत हो सकती है।

0 × 01 एक या अधिक फ़ाइलों को सफलतापूर्वक कॉपी किया गया (यानी, नई फाइलें आ गई हैं)।

0 × 00 कोई त्रुटि नहीं हुई, और कोई भी नकल नहीं की गई। स्रोत और गंतव्य निर्देशिका पेड़ पूरी तरह से सिंक्रनाइज़ हैं।

बस जोड़ें अगर / अन्यथा बयान है कि EXIT /B 0जब वापसी मूल्य 1 या शायद 0 है, और EXIT /B 1अन्यथा। अगर फ़ाइलों की प्रतिलिपि बनाई जा सकती है, तो भी कुछ गलत है जिसे मैन्युअल हस्तक्षेप की आवश्यकता होगी।


108

TechNet ने इस वन-लाइनर को एक्ज़िट कोड को अधिक पारंपरिक एग्ज़िट कोड में बदलने का सुझाव दिया है :

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

या यह निकास कोड को पूरी तरह से अनदेखा करने के लिए (यानी अगर यह विफल या सफल नहीं हुआ तो परवाह नहीं):

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

हालाँकि, ऊपर दिए गए दोनों आदेश एक स्क्रिप्ट को समाप्त कर देंगे जिसके बाद रोबोकॉपी निष्पादित की गई है। यह विशेष रूप से CI बिल्ड के लिए एक मुद्दा है। यदि आप इस परिदृश्य में रोबोकॉपी का उपयोग करना चाहते हैं, तो आपको अप्रासंगिक निकास कोड के लिए मैन्युअल रूप से त्रुटि कोड सेट करने की आवश्यकता है। नीचे, 8 से नीचे के सभी त्रुटि कोडों को बिना किसी त्रुटि के फिर से लिखा जाएगा, और यदि संभव हो तो स्क्रिप्ट को जारी रखा जाएगा।

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

8
अच्छा लगा। रॉबोकॉपी कमांड के चारों ओर कोष्ठक की आवश्यकता है, लेकिन एक आवरण स्क्रिप्ट का उपयोग करके मुझे बचाया।
TheCodeKing

मैं टीम लाइन में कमांड लाइन बिल्ड स्टेप के रूप में काम करने के लिए इस एक-लाइनर को प्राप्त नहीं कर सका। मुझे इसे एक अलग रेखा पर ले जाना था। मैंने एक्जिट कमांड में / B तर्क भी जोड़ा, हालांकि मुझे नहीं लगता कि इसकी आवश्यकता थी।
माइकवेट

Teamcity परिनियोजन के लिए (और न केवल Teamcity) यह टाइप करने के लिए उपयोगी है: IF %ERRORLEVEL% LEQ 3 set errorlevel=0और अगली पंक्ति पर: if %errorlevel% neq 0 exit /b %errorlevel%(यदि बैच फ़ाइल में कई ऑपरेशन हैं, न कि केवल रोबोकॉपी), क्योंकि ठीक कोड कम हैं तो 3. ss64.com/nt/robitopy -exit.html
दाओकाको

6
TeamCity में, आपको ERRORLEVELडबल %% के साथ बचना चाहिए , जैसे: %% ERRORLEVEL %%। अन्यथा, यह इसे TeamCity बिल्ड पैरामीटर मानता है।
यान स्केलेरेंको

2
क्या करता ^&है? ss64 कहते हैं, लेकिन यह मुझे लगता है कि यह बच नहीं जाना चाहिए?
मिलीलीटरदेव

19

जेनकींस से इसे चलाने की जरूरत है ( )और दोनों /B। यदि आप त्रुटि स्तर 1,2,3,4 को अनदेखा करना चाहते हैं:

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

2
LSS 8 और भी बेहतर हो सकता है :)
इवान

13

से यह पेज आप त्रुटियों उत्पादन के लिए त्रुटि कोड की सूची का उपयोग करता है अपने बैच फ़ाइल के लिए एक अनुभाग जोड़ सकते हैं और कोड के विभिन्न वर्गों चला सकते हैं:

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

8

मैं इसका उपयोग करता हूं:

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

उपरोक्त कुछ पोस्टर बिट मास्क की सूक्ष्मता से चूक गए हैं। विशेष रूप से विरोधाभास चूक गया है कि त्रुटि 3 पूरी तरह से सफल प्रतिलिपि इंगित करता है।

ध्यान दें कि बिट 0x01 यदि सेट इंगित करता है कि कुछ फाइलें कॉपी की गई हैं, भले ही अन्य विफलताएं थीं। इसलिए कोई भी विषम संख्या वाली त्रुटियां हमेशा इंगित करती हैं कि कम से कम कुछ फ़ाइलों की प्रतिलिपि बनाई गई है। ध्यान दें कि बिट 0x02 केवल यह इंगित करता है कि गंतव्य पर मौजूद फाइलें हैं जो स्रोत पर मौजूद नहीं हैं। यह तब होगा जब / ई स्विच का उपयोग किया जाता है और पिछली कॉपी ली जाने के बाद से फाइल को स्रोत से हटा दिया गया है। यदि / MIR स्विच का उपयोग किया जाता है तो ऐसा नहीं होना चाहिए क्योंकि स्रोत को मिरर करने के लिए गंतव्य पर फ़ाइलों को हटाना चाहिए (लेकिन मैंने यह परीक्षण नहीं किया है)।

इसलिए दोनों त्रुटिपूर्ण 1 और 3 बिना किसी त्रुटि के फ़ाइलों की सफल प्रतिलिपि इंगित करते हैं। साथ ही त्रुटियां 0 और 2 इंगित करती हैं कि गंतव्य अद्यतित है और कोई भी फाइल कॉपी नहीं की गई थी।

इसके लायक के लिए मैं अपने साधारण बैकअप के लिए निम्न के साथ आया:

यदि त्रुटि 16 इको बैकअप विफल हो गया - ऊपर कारण देखें और गोटो किया

अगर त्रुटि 8 गूंज सब ठीक नहीं है - बैकअप अधूरा और गोटो किया

अगर त्रुटि 4 गूंज सब ठीक नहीं है - कुछ फ़ाइलों को बेमेल और गोटो किया गया

यदि एररलेवल 3 इको बैकअप सफलतापूर्वक पूरा हो गया और गोटो हो गया

अगर त्रुटि 2 इको बैकअप पहले से ही अद्यतित है - कोई फाइल कॉपी और गोटो नहीं किया गया

यदि त्रुटि 1 इको बैकअप सफलतापूर्वक पूरा हो गया और गोटो हो गया

अगर त्रुटि 0 इको बैकअप पहले से ही अद्यतित है - कोई फाइल कॉपी और गोटो नहीं किया गया

मैंने 'अतिरिक्त' फ़ाइलों के बारे में परेशान करने का विकल्प नहीं चुना।

मुझे नहीं पता कि 'बेमेल' त्रुटि क्या है क्योंकि यह अभी तक नहीं हुआ है लेकिन मैंने इसके लिए अनुमति दी है।


6

मैं अतिथि जॉन से सहमत हूं - आप वास्तव में केवल एक त्रुटि का संकेत देना चाहते हैं यदि परिणाम वास्तव में 8 या अधिक है।

तो एक 0 (सफलता) या 1 (असफल) परिणाम के लिए एक रोबोकॉपी परिणाम को मैप करने के लिए, SQL एजेंट नौकरी में उपयोग के लिए उपयुक्त, मैं इसका उपयोग कर रहा हूं:

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

2

TeamCity के लिए मैं इसका उपयोग कर रहा हूं और यह काफी अच्छा काम कर रहा है। माइकवाइट, डाओकाको, और यान स्केलेरेन्को से इनपुट के लिए धन्यवाद। मुझे उत्तर की कल्पना करने में मदद करने के लिए एक पूर्ण कार्य उदाहरण देखने की आवश्यकता है।

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

1
मैं अपने POST-BUILD इवेंट में एक समान रोबोकॉपी स्क्रिप्ट का उपयोग कर रहा हूं .. इसलिए आश्रित पुस्तकालयों को खपत .exe अनुप्रयोग प्रोजेक्ट में कॉपी किया जाता है - जो केवल उलटा-नियंत्रण / सेवा लोकेटर पैटर्न के माध्यम से संदर्भित होते हैं।
bkwdesign

1

gitlab ci के लिए इससे पहले cmd / c जोड़ें।

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

अन्यथा EXIT 0 उस बिंदु पर CI पाइपलाइन को बंद कर देता है।


0

विज़ुअल स्टूडियो 2010+ से दूसरे फ़ोल्डर में समाप्त फ़ाइलों को कॉपी करने के तरीके के बारे में यहां एक उदाहरण है क्योंकि विज़ुअल स्टूडियो एक अच्छी प्रतिलिपि पर 0 नहीं 1 की अपेक्षा करता है।

cmd /c (robocopy $(TargetDir) X:\$(TargetName) $(TargetFileName) $(TargetFileName).config *.dll *.json *.xml /xx) ^& IF %ERRORLEVEL% LEQ 1 exit 0 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.