2009-08-12 22 views
6

Utilizziamo estesamente NAnt per il nostro sistema di compilazione. Recentemente, ho scritto un paio PowerShell Cmdlets per eseguire alcune cose relative al database. Inizialmente, l'intento di questi cmdlet era non da eseguire necessariamente all'interno del nostro processo di compilazione. Tuttavia, questo è diventato di recente un'esigenza e vorremmo eseguire alcuni di questi Cmdlet dal nostro processo di build basato su NAnt.Qual è un buon modo per utilizzare un cmdlet PowerShell in un sistema di build NAnt?

Questi Cmdlet sono scritti in C# e abbiamo uno SnapIn per loro (se questo è importante).

alcune idee:

  • utilizzare il compito di chiamare exec PowerShell? (non sono sicuro di come funzionerebbe comunque)
  • Scrivere un'attività NAnt personalizzata che faccia riferimento e utilizzi il cmdlet?

Quale potrebbe essere un buon modo per farlo?

risposta

5

È possibile utilizzare l'attività exec, impostare l'attributo del programma su powershell.exe e passare alla riga di comando qualcosa come "-Command {}".

In alternativa, è possibile creare un'attività NAnt personalizzata che utilizza internamente le API di hosting PowerShell per eseguire i cmdlet o gli script. C'è un semplice esempio di questo (usando le API PS v1) here.

8

È possibile utilizzare l'attività exec sottostante nel proprio script nant per chiamare i cmdlet 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

Sulla base della risposta di JiBe è il contrario, ecco la soluzione di lavoro. Quando si esegue PowerShell che accetta gli argomenti è necessario eseguire lo script PowerShell quindi gli argomenti.

PS yourscript.ps1 -arg1 value1 -arg2 value2 

a Nant:

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

Il modo migliore credo sia per definire gli argomenti in PS per NAnt è come

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

Quindi, in linea di comando che si intende utilizzare:

PS yourscript.ps1 some_value1 some_value2 

Quindi questo si traduce in 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

Il modo migliore è utilizzare metodi simili a quelli che si potrebbero utilizzare nell'Utilità di pianificazione. Ciò significa eseguire powershell con l'argomento -command e iniziare il comando con &.

Ad esempio:

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

La prego di chiarire l'utilizzo del commerciale? Senza una spiegazione, la tua risposta sembra più o meno la stessa di [risposta di VJ M] (http://stackoverflow.com/a/4311491/622391)? –

+0

La e commerciale è l'operatore di chiamata in PowerShell. Quanto segue è tratto dall'output del comando 'get-help about_operators' sotto operatori speciali: '& Call operator Esegue un comando, script o blocco di script.L'operatore di chiamata, noto anche come "operatore di chiamata", consente di eseguire comandi memorizzati nelle variabili e rappresentati da stringhe. Poiché l'operatore di chiamata non emette il comando, , non può interpretare i parametri di comando. ' –

+1

Per chiarire ulteriormente, Secondo la mia esperienza, l'esclusione di tale argomento può causare l'elaborazione di argomenti da parte di powershell.exe anziché dello script o solo in generale. –