9
votes

Qu'est-ce qu'un bon moyen de consommer une cmdlet PowerShell dans un système de construction nant?

Nous utilisons Nant largement pour notre système de construction. Récemment, j'ai écrit un couple PowerShell CMDlets pour effectuer quelques choses liées à la base de données. Au début, l'intention de ces cmdlets était pas à courir nécessairement dans notre processus de construction. Cependant, cela est récemment devenu besoin et nous souhaitons courir quelques-uns de ces cmdlets de notre processus de construction basé sur Nant.

Ces cmdlets sont écrits en C # et nous avons un snapin pour eux (si cela compte du tout).

Quelques idées:

  • Utilisez le EXEC tâche pour appeler PowerShell? (Je ne sais pas comment cela fonctionnerait cependant)
  • Écrivez une tâche Nante personnalisée qui fait référence et utilise la cmdlet?

    Qu'est-ce qui pourrait être un bon moyen de faire cela?


0 commentaires

4 Réponses :


5
votes

Vous pouvez certainement utiliser la tâche Exec, définir l'attribut de programme à PowerShell.exe et en passant dans la ligne de commande quelque chose comme "-Command {}".

Alternativement, vous pouvez créer une tâche Nant personnalisée qui utilise à l'interne l'API d'hébergement PowerShell pour exécuter vos cmdlets ou vos scripts. Il y a un exemple simple de ceci (à l'aide des API PS V1) ici .


0 commentaires

12
votes

Vous pouvez utiliser la tâche ci-dessous dans votre script nant pour appeler vos 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>


0 commentaires

3
votes

Basé sur la réponse de Jibe, c'est l'inverse, voici la solution de travail. Lorsque vous utilisez PowerShell qui prend des arguments, vous devez exécuter le script PowerShell puis les arguments.

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

0
votes

Le meilleur moyen est d'utiliser des méthodes similaires, car on utiliserait dans le planificateur de tâches. Cela signifie exécuter PowerShell code> avec l'argument code> -Command code> et commencez la commande avec & code>.

Par exemple: P>

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


3 commentaires

Pourriez-vous s'il vous plaît clarifier votre utilisation de l'ampersand? Sans explication, votre réponse a l'air à peu près la même chose que Réponse de VJ m's ?


L'ampersand est l'opérateur d'appel à PowerShell. Ce qui suit est à partir de la sortie de commande 'get-help to_opérators' sous Opérateurs spéciaux: '& Call Operateur exécute une commande, un script ou un bloc de script. L'opérateur d'appel, également appelé "Opérateur d'invocation", vous permet d'exécuter des commandes stockées dans des variables et représentées par des chaînes. Étant donné que l'opérateur d'appel n'est pas analysé la commande, il ne peut pas interpréter les paramètres de commande. '


Pour préciser davantage, dans mon expérience, il ne comprend pas que des arguments puissent être traités par PowerShell.exe au lieu du script ou simplement perdu en général.