2009-05-18 14 views
7

Ho un file batch che utilizza il comando exit per restituire un codice di uscita.Onorare i codici di uscita dai file batch richiamati da msbuild

Questo file batch può, in alcuni casi, essere richiamato in modo interattivo da una riga di comando, o in altri casi, può essere eseguito come parte di un progetto MSBuild, utilizzando l'attività Exec.

  • Se uso exit %errorlevel% nel mio file batch questo funziona bene e MSBuild vede il codice di errore, tuttavia un utente interattivo che esegue il file batch da una finestra di comando otterrà un maleducato uscita di cmd.exe questo caso.
  • Se utilizzo lo exit /b %errorlevel% lo scenario interattivo non ottiene un'uscita maleducata, ma ciò significa anche che il cmd avviato dall'attività Exec non si chiude e pertanto MSBuild non visualizza il valore restituito.

Come soluzione a entrambi i problemi, sto cercando di usare exit /b ma lanciare il file batch dal mio script di build in questo modo:

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

L'idea è che prendo esplicitamente il 'non-terminale 'restituire da exit /b e chiamare manualmente exit per propagare questo valore al di fuori di cmd.exe dove può essere visualizzato dall'attività di creazione Exec.

Questa sembra la soluzione perfetta, tuttavia non funziona. Exec non ottiene ancora il valore di errore corretto.

risposta

13

Un modo per gestire ciò potrebbe essere il passaggio di un parametro al file batch da parte di MSBuild in modo che sappia che MSBuild lo sta chiamando anziché da un prompt dei comandi. Per esempio io ho creato il file di esempio riportato di seguito 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% 

e ho creato il file wrapper.proj MSBuild che è:

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

Se si esegue il file test.bat dal prompt dei comandi il risultato è

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 

E da MSBuild il risultato è:

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

Non ho provato questo, ma cosa succede se è sufficiente impostare una variabile di ambiente di nome ERRORLEVEL? Nascosto dopo il contenuto del comando Exec, MSBuild ha "exit% ERRORLEVEL%". % ERRORLEVEL% se impostato sovrascrive qualsiasi livello di errore effettivo.

2

questa domanda è un po 'più vecchio, ma la risposta può essere ancora di interesse, quindi ecco qui:

modificare leggermente il vostro compito MSBuild per

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

e mantenere il

exit /b %errorlevel% 

nel tuo Batch.cmd.

Problemi correlati