我们广泛使用NAnt构建系统。最近,我写了几个PowerShell Cmdlets来执行一些与数据库相关的事情。起初,这些Cmdlet的意图不必须在我们的构建过程中运行。但是,这最近成为一种需求,我们希望从基于NAnt的构建过程中运行一些Cmdlet。
这些Cmdlet是用C#编写的,我们有一个SnapIn(如果这很重要的话)。
一些想法:
这可能是一个好方法吗?
答案 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>