2009-05-18 19 views
7

द्वारा आवंटित बैच फ़ाइलों से बाहर निकलने वाले कोडों का सम्मान करना मेरे पास एक बैच फ़ाइल है जो exit आदेश का उपयोग निकास कोड लौटने के लिए कर रही है।msbuild

यह बैच फ़ाइल, कुछ मामलों में, कमांडलाइन से इंटरैक्टिव रूप से लागू की जा सकती है, या अन्य मामलों में, Exec कार्य का उपयोग करके एमएसबिल्ड परियोजना के हिस्से के रूप में चलाया जा सकता है।

  • अगर मैं अपने बैच फ़ाइल यह अच्छी तरह से काम करता है और MSBuild त्रुटि कोड देखता भीतर exit %errorlevel% उपयोग करते हैं, जो एक कमांड विंडो से बैच फ़ाइल चल रहा है में cmd.exe की एक अशिष्ट बाहर निकलें मिल जाएगा तथापि एक इंटरैक्टिव उपयोगकर्ता ये मामला।
  • यदि मैं exit /b %errorlevel% का उपयोग करता हूं तो इंटरैक्टिव परिदृश्य को कठोर निकास नहीं मिलता है, लेकिन इसका मतलब यह भी है कि cmd मेरे Exec कार्य द्वारा लॉन्च नहीं किया गया है, और इसलिए एमएसबिल्ड को रिटर्न वैल्यू नहीं दिखता है।

दोनों समस्याओं के लिए एक समाधान के रूप में, मैं exit /b उपयोग करते हैं लेकिन इस तरह अपने निर्माण स्क्रिप्ट से बैच फ़ाइल शुरू करने की कोशिश कर रहा हूँ:

<Exec Command="Batch.cmd params &amp; exit %errorlevel%" /> 

विचार किया जा रहा है कि मैं स्पष्ट रूप से 'गैर टर्मिनल ले 'exit /b से वापस लौटें और पर के बाहर इस मान को लागू करने के लिए मैन्युअल रूप से कॉल करें जहां Exec बिल्ड कार्य इसे देख सकता है।

यह सही समाधान की तरह लगता है, लेकिन यह काम नहीं कर रहा। Exec अभी भी सही त्रुटि मान नहीं मिलता है।

उत्तर

13

यह संभालने का एक तरीका एमएसबिल्ड बैच फ़ाइल में पैरामीटर पास कर सकता है ताकि यह जान सके कि एमएसबिल्ड इसे कमांड प्रॉम्प्ट से कॉल कर रहा है। उदाहरण के लिए मैं नमूना फ़ाइल test.bat नीचे

ECHO OFF 

IF (%1)==() goto Start 
SET fromMSBuild=1 

:Start 

ECHO fromMSBuild:%fromMSBuild% 


REM ***** Perform your actions here ***** 

set theExitCode=101 
GOTO End 



:End 
IF %fromMSBuild%==1 exit %theExitCode% 


REM **** Not from MSBuild **** 

ECHO Exiting with exit code %theExitCode% 
exit /b %theExitCode% 

दिखाया बनाया है और मैं MSBuild फ़ाइल wrapper.proj जो है बना लिया है:

<Project DefaultTargets="Demo" ToolsVersion="3.5" 
     xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

    <PropertyGroup> 
    <BatchFile>test.bat</BatchFile> 
    <FromMSBuild>FromMSBuild</FromMSBuild> 
    </PropertyGroup> 

    <Target Name="Demo"> 

    <Message Text="Executing batch file $(BatchFile)" Importance="high"/> 

    <PropertyGroup> 
     <_Command>$(BatchFile) $(FromMSBuild)</_Command> 
    </PropertyGroup> 

    <Exec Command="$(_Command)"> 
     <Output PropertyName="CommandExitCode" TaskParameter="ExitCode"/> 
    </Exec> 

    <Message Text="CommandExitCode: $(CommandExitCode)"/> 

    </Target> 
</Project> 

आप फ़ाइल test.bat पर अमल करते हैं आदेश से संकेत परिणाम

C:\Data\Development\My Code\Community\MSBuild\BatchFile>test.bat 

C:\Data\Development\My Code\Community\MSBuild\BatchFile>ECHO OFF 
fromMSBuild:0 
Exiting with exit code 101 

है और MSBuild से परिणाम है:

C:\Data\Development\My Code\Community\MSBuild\BatchFile>msbuild Wrapper.proj /t:Demo /fl /nologo 
Build started 5/18/2009 10:54:52 PM. 
Project "C:\Data\Development\My Code\Community\MSBuild\BatchFile\Wrapper.proj" on node 0 (Demo target(s)). 
    Executing batch file test.bat 
    fromMSBuild:1 
C:\Data\Development\My Code\Community\MSBuild\BatchFile\Wrapper.proj(17,5): error MSB3073: The command "test.bat FromMSBuild" exi 
ted with code 101. 
Done Building Project "C:\Data\Development\My Code\Community\MSBuild\BatchFile\Wrapper.proj" (Demo target(s)) -- FAILED. 


Build FAILED. 

"C:\Data\Development\My Code\Community\MSBuild\BatchFile\Wrapper.proj" (Demo target) (1) -> 
(Demo target) -> 
    C:\Data\Development\My Code\Community\MSBuild\BatchFile\Wrapper.proj(17,5): error MSB3073: The command "test.bat FromMSBuild" e 
xited with code 101. 

    0 Warning(s) 
    1 Error(s) 

Time Elapsed 00:00:00.06 

सैयद इब्राहिम हाशिमी

मेरे पुस्तक: Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

0

मैं इस प्रयास नहीं किया है, लेकिन क्या तुम सिर्फ एक वातावरण चर ERRORLEVEL नामित सेट करते हैं? अपने Exec आदेश की सामग्री के बाद छिपे हुए, MSBuild "बाहर निकलें% errorlevel%" है। % Errorlevel% अगर सेट किसी भी वास्तविक त्रुटि स्तर ओवरराइड करता है।

2

यह सवाल थोड़ा पुराना है, लेकिन अभी भी प्रतिक्रिया रुचि का हो सकता है, इसलिए यहाँ जाता है:

थोड़ा

<Exec Command='cmd.exe /C "call Batch.cmd params &amp;&amp; exit %errorlevel%"' /> 

करने के लिए अपने MSBuild कार्य को संशोधित करने और

exit /b %errorlevel% 
रखने आपके Batch.cmd में