2009-08-12 36 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

相关问题