2009-08-12 45 views
6

我們廣泛使用NAnt作爲我們的構建系統。最近,我寫了幾個PowerShell Cmdlets來執行一些數據庫相關的事情。起初,這些Cmdlet的意圖是而不是必須在我們的構建過程中運行。然而,這最近已成爲一種需求,我們希望從我們的基於NAnt的構建過程中運行一些這些Cmdlet。在NAnt構建系統中使用PowerShell Cmdlet的好方法是什麼?

這些Cmdlet是用C#編寫的,我們有一個SnapIn(如果這很重要)。

幾個想法:

  • 使用exec任務來調用PowerShell的? (不知道這是如何工作的)
  • 寫一個自定義NAnt任務,引用和使用Cmdlet?

什麼可能是一個很好的方法來做到這一點?

回答

5

您當然可以使用exec任務,將程序屬性設置爲powershell.exe,並在命令行中傳遞類似「-Command {}」的內容。

或者,您當然可以創建一個自定義的NAnt任務,它在內部使用託管API來執行您的cmdlet或腳本。有一個簡單的例子(使用PS v1 API)here

8

你可以在你的腳本中使用下面的exec任務來調用你的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

基於JiBe的回答,其他方式,這裏是工作解決方案。運行需要參數的powershell時,需要運行powershell腳本,然後運行參數。

PS yourscript.ps1 -arg1 value1 -arg2 value2 

在南特:

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

我認爲最好的辦法是在PS中定義的參數爲楠就像

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

因此,在命令行中,你將使用:

PS yourscript.ps1 some_value1 some_value2 

然後這翻譯在NAnt裏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

最好的方法是使用與在任務調度程序中使用的方法類似的方法。這意味着運行powershell-command參數並開始與&命令。

例如:

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

能否請你澄清你的符號的使用?沒有解釋,你的答案看起來幾乎與[VJ M的答案](http://stackoverflow.com/a/4311491/622391)相同? – 2015-12-15 23:12:35

+0

&符號是PowerShell中的調用操作符。以下內容來自特殊運算符下的'get-help about_operators'命令輸出:'&Call運算符 運行命令,腳本或腳本塊。調用操作符(也稱爲 「調用操作符」)允許您運行存儲在變量中並由字符串表示的命令。由於呼叫運營商不解析命令,所以它不能解釋命令參數。' – 2016-01-28 21:59:08

+1

爲了進一步闡明,根據我的經驗,不包括它可能會導致參數由powershell.exe而不是腳本處理,或者一般都會丟失。 – 2016-01-28 22:13:07

相關問題