2010-10-24 16 views
27

Estoy escribiendo un script de compilación con Powershell. Las secuencias de comandos lleva a cabo diversas operaciones tales como conseguir la última versión del código fuente de la SVN, copias de seguridad, etc., y construye la solución utilizando MSBuild:MSBuild en una secuencia de comandos Powershell - ¿Cómo puedo saber si la compilación tuvo éxito?

cmd /c C:\WINDOWS\Microsoft.NET\Framework\v3.5\msbuild.exe "C:\Dev\Path\MyProjct.sln" /p:Configuration=Release 

Después de esta instrucción, sólo quiero ejecutar el resto de la secuencia de comandos si la compilación tuvo éxito. ¿Cómo puedo verificar esto?

El proyecto es un proyecto web, por lo que no es tan fácil buscar una salida, pero supongo que algunas variables contendrán el resultado de la compilación. Además, dado que llamo a msbuild con cmd/c, ¿podré acceder a estas variables?

+0

Tengo curiosidad ... ¿por qué utilizar un script de PowerShell para hacer la acumulación? ¿Por qué no usar un archivo MSBuild y usar las ibrer de tareas de extensión para hacer cosas como get from SVN? PowerShell es genial y poderoso, pero en cierta medida estás tomando el camino difícil. – slugster

+0

Bueno, lo primero es que realmente no conozco MSBuild, pero tengo una idea de que es una herramienta para construir, y puedo tener dificultades para interactuar con cualquier otra cosa (SVN, WinRAR, ...). Para mí, la construcción es solo el 5% del proceso de desarrollo y creo que un lenguaje de scripting es el más apropiado para el otro 95%. Pero estoy feliz de estar equivocado. –

+2

MSBuild es una gran herramienta de dependencia orientada a tareas. El uso de PowerShell permite numerosos escenarios y permite enfoques orientados a productos. Echa un vistazo a PSake también, lo usamos. Cuando desee extender las cosas, no tiene que caer en C# (Tareas de MSBuild). Simplemente agrega más PowerShell. –

Respuesta

36

Compruebe el valor de $LastExitCode justo después de la llamada a MSBUILD. Si es 0, entonces MSBUILD tuvo éxito, de lo contrario, falló.

BTW no es necesario usar cmd/c. Simplemente llame a MSBUILD.exe directamente. Hacemos eso en las secuencias de comandos de compilación de PowerShell todo el tiempo.

+0

¿Cómo aparece el mensaje de error cuando usa $ LastExitCode? – Rookian

+0

Puede capturar la salida del exe (incluido stderr). Eso es independiente de verificar el valor de $ LastExitCode. –

+0

Utilizo el objeto C# System.Management.Automation.PowerShell y llamo al método síncrono Invoke. El problema es que ni el flujo de error tiene una entrada ni PowerShell.HadErrors es verdadero. – Rookian

10

Para verificar el éxito/fracaso, utilice la variable automática $?.

 
PS> help about_Automatic_Variables 


    $? 
     Contains the execution status of the last operation. It contains 
    TRUE if the last operation succeeded and FALSE if it failed. 

por ejemplo:

 
msbuild 
if (! $?) { throw "msbuild failed" } 
+5

Mientras '$?' Funciona en este caso, tenga en cuenta que una cantidad de consolas (especialmente las herramientas de Microsoft) invierten la lógica del código de salida para devolver múltiples códigos de éxito. Entonces '$?' No funcionará en esos ex. –

Cuestiones relacionadas