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


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

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

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

EXIT /B 0

चल रही जा रही स्क्रिप्ट के लिए।

हालांकि, यह निश्चित रूप से किसी भी वास्तविक समस्या का मुखौटा करता है जो रोबोकॉपी वापस आ जाएगा।

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

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


111
2018-05-07 13:03


मूल


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


जवाब:


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

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

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

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

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

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

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

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


43
2018-05-07 13:34





टेकनेट सुझाव देता है निकास कोड को अधिक पारंपरिक निकास कोड में बदलने के लिए यह एक लाइनर:

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

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

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

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

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

93
2018-06-18 05:26



अच्छा लगा। Robocopy कमांड के चारों ओर ब्रैकेट की जरूरत है, लेकिन मुझे एक रैपर स्क्रिप्ट का उपयोग करके बचाया। - TheCodeKing
टीमसीटी में कमांड लाइन बिल्ड चरण के रूप में काम करने के लिए मुझे यह एक लाइनर नहीं मिल सका। मुझे इसे एक अलग लाइन में ले जाना पड़ा। मैंने निकास आदेश में / B तर्क भी जोड़ा, हालांकि मुझे नहीं लगता कि यह आवश्यक था। - MikeWyatt
टीमसिटी परिनियोजन (और न केवल टीमसिटी) के लिए यह टाइप करने के लिए उपयोगी है: IF %ERRORLEVEL% LEQ 3 set errorlevel=0 और अगली पंक्ति पर: if %errorlevel% neq 0 exit /b %errorlevel% (यदि बैच फ़ाइल में कई ऑपरेशन होते हैं, न केवल रोबोकॉपी), क्योंकि ठीक कोड 3 से कम होते हैं। ss64.com/nt/robocopy-exit.html - DaoCacao
टीमसिटी में, आपको बच जाना चाहिए ERRORLEVEL डबल %% के साथ, इस तरह: %% ERRORLEVEL %%। अन्यथा, यह टीमसिटी बिल्ड पैरामीटर माना जाता है। - Yan Sklyarenko
इससे क्या होता है ^& करना? ss64 कहते हैं भाग निकलता है लेकिन ऐसा लगता है कि इसे बचाना नहीं चाहिए? - mlhDev


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

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

17
2018-05-07 13:35



एलएसएस 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





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

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

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

मेरे सरल बैकअप के लिए मैं इसके लायक होने के लिए क्या लायक हूं:

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

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

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

अगर त्रुटि-स्तर 3 गूंज बैकअप सफलतापूर्वक पूरा हो गया और पूरा हो गया

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

अगर errorlevel 1 गूंज बैकअप सफलतापूर्वक पूरा हो गया और पूरा हो गया

अगर errorlevel 0 गूंज पहले से ही अद्यतित है - कोई भी प्रतिलिपि बनाई गई और गोटो नहीं हुई

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

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


8
2017-10-24 03:36





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

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

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

6
2018-02-05 01:01





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

(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



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


विजुअल स्टूडियो 2010+ से किसी अन्य फ़ोल्डर में तैयार फ़ाइलों की प्रतिलिपि बनाने के तरीके पर यहां एक उदाहरण है क्योंकि विजुअल स्टूडियो एक अच्छी प्रति पर 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