在NAnt构建系统中使用PowerShell Cmdlet的好方法是什么?

时间:2009-08-12 18:44:44

标签: powershell build-automation nant

我们广泛使用NAnt构建系统。最近,我写了几个PowerShell Cmdlets来执行一些与数据库相关的事情。起初,这些Cmdlet的意图必须在我们的构建过程中运行。但是,这最近成为一种需求,我们希望从基于NAnt的构建过程中运行一些Cmdlet。

这些Cmdlet是用C#编写的,我们有一个SnapIn(如果这很重要的话)。

一些想法:

  • 使用exec任务调用PowerShell? (不知道这会怎样起作用)
  • 编写引用并使用Cmdlet的自定义NAnt任务?

这可能是一个好方法吗?

4 个答案:

答案 0 :(得分:12)

您可以在nant脚本中使用以下exec任务来调用ps cmdlet。

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

答案 1 :(得分:5)

你当然可以使用exec任务,将program属性设置为powershell.exe,并在命令行中输入类似“-Command {}”的内容。

或者,您可以创建一个自定义的NAnt任务,该任务在内部使用powershell托管API来执行您的cmdlet或脚本。有一个简单的例子(使用PS v1 API)here

答案 2 :(得分:3)

基于JiBe的回答,反过来说,这是工作解决方案。运行带有参数的powershell时,需要运行powershell脚本,然后运行参数。

PS yourscript.ps1 -arg1 value1 -arg2 value2

在NAnt:

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

我认为最好的方法是在PS中为NAnt定义参数就像

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

因此,在命令行中,您将使用:

PS yourscript.ps1 some_value1 some_value2

然后在NAnt翻译如下:

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

答案 3 :(得分: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>