2011-03-29 10 views
23

सफलता पर 0 से बाहर निकलने वाले अधिकांश कार्यक्रमों के विपरीत रोबोकॉपी सफलता पर 1 आउटपुट करता है। विजुअल स्टूडियो (और एमएसबीयूआईएलडी) एक त्रुटि के रूप में 1 के निकास कोड का अर्थ देता है।विजुअल स्टूडियो 2010 पोस्ट-बिल्ड और प्री-बिल्ड इवेंट्स के साथ रोबोकॉपी का उपयोग

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

नोट: यह this post का पुन: पोस्ट कम या कम है।

उत्तर

4

MSBuild extensionpack एक लड़ी कार्य होता है आप अपनी निर्माण प्रक्रिया में उपयोग कर सकते हैं।
क्या यह आपके लिए वीएस प्री/पोस्टबिल्ड घटनाओं के बजाय समाधान हो सकता है?

यदि हां, तो आप कर सकते हैं extend the Visual Studio Build Process BeforeBuild, AfterBuild लक्ष्य अधिभावी और लड़ी कार्य बुला (आपको अन्य लक्ष्यों को ओवरराइड कर सकते हैं अगर वे अपनी आवश्यकताओं के अनुरूप बेहतर होता है, जुड़ा हुआ MSDN पेज में सूची देखें)
तो द्वारा वास्तव में आप डाउनलोड करने और अपने परियोजना की csproj/vbproj फ़ाइल को खोलने से MSBuild extensionpack स्थापित करने और संपादित करना चाहिए नीचे दिए तरीक़े:

आयात करने MSBuild extensionpack की लड़ी कार्य के लिए निम्न प्रविष्टियों को जोड़ने

<PropertyGroup> 
    <TPath>$(MSBuildExtensionsPath32)\ExtensionPack\4.0\MSBuild.ExtensionPack.tasks</TPath>   
</PropertyGroup> 
<Import Project="$(TPath)"/> 

अधिभावी BeforeBuild, AfterBuild और लड़ी कार्य

<Target Name="BeforeBuild"> 
<Message Text="Beforebuild" /> 
    <MSBuild.ExtensionPack.FileSystem.RoboCopy Source="C:\temp\robo_src1" Destination="C:\temp\robo_dest1" Files="*.*" Options="/MIR"> 
     <Output TaskParameter="ExitCode" PropertyName="Exit" /> 
     <Output TaskParameter="ReturnCode" PropertyName="Return" /> 
    </MSBuild.ExtensionPack.FileSystem.RoboCopy> 
    <Message Text="ExitCode = $(Exit)"/> 
    <Message Text="ReturnCode = $(Return)"/> 
</Target> 
<Target Name="AfterBuild"> 
    <MSBuild.ExtensionPack.FileSystem.RoboCopy Source="C:\temp\robo_src2" Destination="C:\temp\robo_dest2" Files="*.*" Options="/MIR"> 
     <Output TaskParameter="ExitCode" PropertyName="Exit" /> 
     <Output TaskParameter="ReturnCode" PropertyName="Return" /> 
    </MSBuild.ExtensionPack.FileSystem.RoboCopy> 
    <Message Text="ExitCode = $(Exit)"/> 
    <Message Text="ReturnCode = $(Return)"/> 
</Target> 
+0

से नीचे मेरा उत्तर देखें, क्या आप कृपया अपने उत्तर में यह बता सकते हैं कि इसे कैसे जोड़ें। यह एक ही उद्देश्य परोसता है? –

+0

क्षमा करें, कोड छोटा कर दिया गया था मैं संपादक से बहुत परिचित नहीं हूं .. मैं कोड को सही तरीके से जोड़ने के तरीके को हल करने का प्रयास कर रहा हूं –

+0

मैंने इसे संपादित किया है। कृपया सत्यापित करें कि यह वही है जो आप चाहते थे। –

19

साथ <src>, <TGT> सम्मान से प्रतिलिपि स्रोत और लक्ष्य जा रहा है, और < > ऑप्ट robocopy विकल्पों किया जा रहा है:

robocopy <opt> <src> <tgt> 
set rce=%errorlevel% 
if not %rce%==1 exit %rce% else exit 0 

उदाहरण के लिए, हम ग परियोजना लक्ष्य कॉपी करना चाहते हैं: \ अस्थायी, पुनः के बिना और सभी उप-निर्देशिका (खाली है या नहीं) के साथ, हम उपयोग करेंगे:

robocopy /R:0 /E $(TargetDir) c:\temp 
set rce=%errorlevel% 
if not %rce%==1 exit %rce% else exit 0 
+9

आप आसानी से 'अगर त्रुटि से बाहर निकलें 1 बाहर निकलें 0 और बाहर निकलें% errorlevel% ' – mafu

+1

@ mafutrct: wunderbar! यदि आपने अपनी टिप्पणी को उत्तर के रूप में जोड़ा है, तो मैं इसे ऊपर उठाऊंगा। –

+5

@ माफ्यूटक्ट नहीं! 'अगर त्रुटि 1 ...' का अर्थ है "अगर त्रुटि 1 से अधिक या बराबर थी"। दूसरे शब्दों में, यह सभी त्रुटियों को पकड़ता है, लेकिन "कोई प्रतिलिपि की आवश्यकता नहीं थी" (रोबोकॉपी का 0 निकास कोड)। लेकिन मुझे लगता है कि आपको 'if% errorlevel% leq 1 निकास 0 की आवश्यकता है और बाहर निकलें% errorlevel%'। – skrebbel

17

अनुरोध के अनुसार इस जवाब को जोड़ने से क्रियान्वित। असफ के समाधान के आधार पर, और skrebbel की टिप्पणी जोड़ना।

robocopy <opt> <src> <tgt> 
if %errorlevel% leq 1 exit 0 else exit %errorlevel% 

के रूप में कृपया टिप्पणी में कहा, आप '1' को समायोजित करना चाहते हो सकता है::

आप करने के लिए चेक सरल बना सकते हैं यह क्या आपके ऑपरेशन एक त्रुटि के रूप में व्यवहार करना चाहिए पर निर्भर करता है। the meaning of the bits that in combination make up the number returned by robocopy पर एक नज़र डालें:

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

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

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

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

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

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

+0

वास्तव में केवल 7 (8 और ऊपर) से अधिक मान विफलता इंगित करते हैं, –

+1

से नीचे मेरा उत्तर देखें @ ओहडस्चनेडर, मैंने इस – mafu

7

सीधे शब्दों में 1 की एक निकास कोड के लिए जाँच, वह सही नहीं है any exit code below 8 is non-erroneous के रूप में:

किसी भी 8 से अधिक मूल्य इंगित करता है कम से कम एक विफलता प्रतिलिपि ऑपरेशन के दौरान की गई थी।

(बस स्पष्ट करने के लिए, 8 की एक निकास कोड एक त्रुटि के रूप में अच्छी तरह से है: Several files did not copy)

उचित कोड है, तो, इस तरह दिखना चाहिए:

IF %ERRORLEVEL% GEQ 8 exit 1 
exit 0 
+1

को स्पष्ट करने के लिए उत्तर संपादित किया है स्वीकार्य उत्तर हो! – nawfal

3
वाक्य रचना यहाँ

एक है एक-पंक्ति-प्रति-आदेश संस्करण कि सीधे prebuild कदमों के भीतर काम करता है:

(robocopy "$(ProjectDir)..\Dir1" "$(ProjectDir)Dir1" "Match.*" /a+:R) ^& IF %ERRORLEVEL% GEQ 8 exit 1 
(robocopy "$(ProjectDir)..\Dir2" "$(ProjectDir)Dir2" "Match.*" /a+:R) ^& IF %ERRORLEVEL% GEQ 8 exit 1 
exit 0 

संदर्भ:

  • @OhadSchneider क्यों बाहर निकलने 0 जरूरतों अंत में होने के लिए पर geq 8
  • This answer के लिए इस सवाल का जवाब।
संबंधित मुद्दे