2009-05-18 24 views
7

Tôi có một tập tin thực thi đang sử dụng lệnh exit để trả lại mã thoát.Tôn vinh mã thoát khỏi các tập tin batch được gọi bởi msbuild

Tệp lô này có thể được gọi tương tác từ dòng lệnh hoặc trong các trường hợp khác, có thể được chạy như một phần của dự án MSBuild, sử dụng tác vụ Exec.

  • Nếu tôi sử dụng exit %errorlevel% trong tập tin thực thi của tôi làm việc này tốt và MSBuild thấy mã lỗi, tuy nhiên một người sử dụng tương tác người đang chạy tập tin thực thi từ một cửa sổ lệnh sẽ nhận được một lối ra thô lỗ của cmd.exe trong trường hợp này.
  • Nếu tôi sử dụng exit /b %errorlevel% trường hợp tương tác không bị thoát thô lỗ, nhưng điều này cũng có nghĩa là cmd được khởi chạy bởi tác vụ Exec của tôi cũng không thoát và do đó MSBuild không thấy giá trị trả lại.

Là một giải pháp cho cả hai vấn đề, tôi đang cố gắng sử dụng exit /b nhưng khởi động tập tin thực thi từ xây dựng kịch bản của tôi như thế này:

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

Ý tưởng được rằng tôi dứt khoát lấy 'phi terminal 'trở về từ số exit /b và gọi theo cách thủ công exit để chuyển giá trị này ra ngoài cmd.exe trong đó Tác vụ Xây dựng Exec có thể xem được.

Điều này có vẻ như giải pháp hoàn hảo, tuy nhiên nó không hoạt động. Exec vẫn không nhận được giá trị lỗi chính xác.

Trả lời

13

Một cách để xử lý điều này có thể là để MSBuild chuyển một tham số cho tệp lô để biết rằng MSBuild đang gọi nó thay vì từ dấu kiểm nhắc lệnh. Ví dụ tôi đã tạo ra các tập tin test.bat mẫu hình dưới đây

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% 

Và tôi đã tạo tệp wrapper.proj MSBuild đó là:

<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> 

Nếu bạn chạy file test.bat từ dấu nhắc lệnh, kết quả là

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 

Và từ MSBuild kết quả là:

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 

Sayed Ibrahim Hashimi

My Book: Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

0

Tôi đã không cố gắng này, nhưng những gì nếu bạn chỉ cần thiết lập một biến môi trường có tên ERRORLEVEL? Ẩn sau khi nội dung của lệnh Exec của bạn, MSBuild có "thoát% ERRORLEVEL%". % ERRORLEVEL% nếu thiết lập ghi đè bất kỳ mức độ lỗi thực tế nào.

2

Câu hỏi này lớn hơn một chút, nhưng câu trả lời vẫn có thể quan tâm, vì vậy ở đây đi:

Hơi sửa đổi nhiệm vụ MSBuild của bạn để

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

Và giữ

exit /b %errorlevel% 

trong Batch.cmd của bạn.

Các vấn đề liên quan