2009-05-18 7 views
7

Ich habe eine Batch-Datei, die den exit Befehl verwendet, um einen Exit-Code zurückzugeben.Vergeben von Exit-Codes aus Batch-Dateien, die von Msbuild aufgerufen werden

Diese Stapeldatei kann in einigen Fällen interaktiv über eine Befehlszeile aufgerufen werden oder in anderen Fällen als Teil eines MSBuild-Projekts mit der Task Exec ausgeführt werden.

  • Wenn ich exit %errorlevel% in meiner Batch-Datei verwenden, das funktioniert gut und MSBuild sieht den Fehlercode, jedoch ein interaktiver Benutzer, den die Batch-Datei aus einem Befehlsfenster ausgeführt wird, wird eine rohe Ausfahrt cmd.exe erhält in dieser Fall.
  • Wenn ich exit /b %errorlevel% verwende, erhält das interaktive Szenario keinen unhöflichen Ausgang, aber dies bedeutet auch, dass der von meiner Exec gestartete Task cmd ebenfalls nicht beendet wird und daher MSBuild den Rückgabewert nicht erkennt.

Als Lösung für beide Probleme, ich versuche exit /b zu verwenden, aber die Batch-Datei von meinem Build-Skript wie folgt starten:

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

Die Idee ist, dass ich die ‚Nicht-Terminal ausdrücklich nehmen 'Rückkehr von exit /b und manuell exit aufrufen, um diesen Wert außerhalb von cmd.exe zu propagieren, wo die Exec Build Task es sehen kann.

Dies scheint die perfekte Lösung, aber es funktioniert nicht. Exec erhält immer noch nicht den richtigen Fehlerwert.

Antwort

13

Eine Möglichkeit, dies zu umgehen, könnte darin bestehen, dass MSBuild einen Parameter an die Stapeldatei übergibt, sodass dieser weiß, dass MSBuild ihn statt von einer Eingabeaufforderung aufruft. Zum Beispiel habe ich die Beispieldatei test.bat unter

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% 

gezeigt erstellt und ich habe die MSBuild-Datei wrapper.proj erstellt, die ist:

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

Wenn Sie die Datei ausführen test.bat von der Eingabeaufforderung das Ergebnis

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 

ist und von MSBuild ist das Ergebnis:

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

ich nicht versucht haben, aber was ist, wenn Sie nur eine Umgebungsvariable namens Error-? Versteckt nach dem Inhalt Ihres Exec-Befehls hat MSBuild "exit% ERRORLEVEL%". % ERRORLEVEL% wenn gesetzt, überschreibt jede tatsächliche Fehlerstufe.

2

Diese Frage ist etwas älter, aber die Antwort immer noch von Interesse sein kann, geht so hier:

leicht Ihre Aufgabe

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

zu MSBuild ändern und die

exit /b %errorlevel% 
halten

in Ihrer Batch.cmd.

Verwandte Themen