2009-08-12 5 views
6

Usamos NAnt ampliamente para nuestro sistema de compilación. Recientemente, he escrito un par de PowerShell Cmdlets para realizar algunas cosas relacionadas con la base de datos. Al principio, la intención de estos Cmdlets era no para ejecutarse necesariamente dentro de nuestro proceso de compilación. Sin embargo, esto se ha convertido recientemente en una necesidad y nos gustaría ejecutar algunos de estos cmdlets de nuestro proceso de compilación basado en NAnt.¿Cuál es una buena manera de consumir un Cmdlet de PowerShell en un sistema de compilación NAnt?

Estos cmdlets están escritos en C# y tenemos un complemento para ellos (si eso es importante).

algunas ideas:

  • exec utilizar la tarea de llamar PowerShell? (no estoy seguro de cómo funcionaría esto)
  • Escriba una tarea NAnt personalizada que haga referencia y use el Cmdlet?

¿Cuál podría ser una buena forma de hacerlo?

Respuesta

5

Sin duda podría utilizar la tarea ejecutiva, estableciendo el atributo de programa en powershell.exe y pasando en la línea de comandos algo así como "-Command {}".

Como alternativa, podría crear una tarea NAnt personalizada que internamente utilice las API de alojamiento de powershell para ejecutar sus cmdlets o scripts. Hay un ejemplo simple de esto (usando las API de PS v1) here.

8

Puede utilizar la siguiente tarea ejecutable en su script nant para llamar a sus cmdlets ps.

<exec program="powershell" workingdir="${BuildManagementDir}" verbose="true"> 
    <arg value="-noprofile"/> 
    <arg value="-nologo"/> 
    <arg value="-noninteractive"/> 
    <arg value="-command"/> 
    <arg value=".\xyz.ps1"/> 
</exec> 
2

Basado en la respuesta de JiBe es al revés, aquí está la solución de trabajo. Cuando ejecuta powershell que requiere argumentos, necesita ejecutar el script de powershell y luego los argumentos.

PS yourscript.ps1 -arg1 value1 -arg2 value2 

En Nant:

<exec program="powershell" workingdir="${powershell_dir}" verbose="true"> 
    <arg value=".\yourscript.ps1"/>  
    <arg value="-arg1 ${value1}"/> 
    <arg value="-arg2 ${value2}"/> 
</exec> 

La mejor manera en que pienso es definir los argumentos de PS para Nant es como

$value1=$args[0] 
$value2=$args[1] 

Así, en la línea de comandos que va a utilizar:

PS yourscript.ps1 some_value1 some_value2 

Entonces esto se traduce en NAnt li ke:

<property name="Value1" value="some_Value1" /> 
<property name="Value2" value="some_Value2" /> 

    <exec program="powershell" workingdir="${powershell_dir}" verbose="true"> 
     <arg value=".\yourscript.ps1"/>  
     <arg value="${value1}"/> 
     <arg value="${value2}"/> 
    </exec> 
0

La mejor manera es utilizar métodos similares a los que se usarían en el programador de tareas. Eso significa ejecutar powershell con el argumento -command y comenzar el comando con &.

Por ejemplo:

<exec program="powershell" workingdir="${ifscriptrequires}" verbose="true"> 
    <arg line="-Command" /> 
    <arg line="$amp; C:\scripts\somescript.ps1 -SwitchParam -someargument 'somevalue' 'somepositionalparameter'" /> 
</exec> 
+0

Podrían aclarar su uso del signo? Sin una explicación, su respuesta se ve más o menos lo mismo que [la respuesta de VJ M] (http://stackoverflow.com/a/4311491/622391)? –

+0

El ampersand es el operador de llamada en powershell. Lo siguiente es de la salida del comando 'get-help about_operators' en operadores especiales: & operador de llamadas Ejecuta un comando, script o bloque de script.El operador de llamada, también conocido como el "operador de invocación", le permite ejecutar comandos que están almacenados en las variables y representados por cadenas. Como el operador de llamada no procesa el comando , no puede interpretar los parámetros del comando. ' –

+1

Para aclarar más, en mi experiencia, no incluirlo puede hacer que los argumentos sean procesados ​​por powershell.exe en lugar del script o simplemente se pierdan en general. –

Cuestiones relacionadas