什么';在NAnt生成系统中使用PowerShell Cmdlet的好方法是什么?

什么';在NAnt生成系统中使用PowerShell Cmdlet的好方法是什么?,powershell,build-automation,nant,Powershell,Build Automation,Nant,我们在构建系统中广泛使用。最近,我写了几篇文章来执行一些与数据库相关的事情。起初,这些cmdlet的目的是而不是在我们的构建过程中运行。然而,这最近已经成为一种需要,我们希望从基于NAnt的构建过程中运行其中一些cmdlet 这些cmdlet是用C#编写的,我们为它们提供了一个管理单元(如果这很重要的话) 一些想法: 是否使用该任务调用PowerShell?(但不确定这将如何工作) 是否编写引用并使用Cmdlet的自定义NAnt任务 做这件事的好方法是什么 您当然可以使用exec任务,将程序

我们在构建系统中广泛使用。最近,我写了几篇文章来执行一些与数据库相关的事情。起初,这些cmdlet的目的是而不是在我们的构建过程中运行。然而,这最近已经成为一种需要,我们希望从基于NAnt的构建过程中运行其中一些cmdlet

这些cmdlet是用C#编写的,我们为它们提供了一个管理单元(如果这很重要的话)

一些想法:

  • 是否使用该任务调用PowerShell?(但不确定这将如何工作)
  • 是否编写引用并使用Cmdlet的自定义NAnt任务

做这件事的好方法是什么

您当然可以使用exec任务,将程序属性设置为powershell.exe,并在命令行中传递类似“-command{}”的内容


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

您可以在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>

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

最好的方法是使用与任务调度器中类似的方法。这意味着使用
-command
参数运行
powershell
,并以
&
开始命令

例如:

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


请您澄清您使用的符号是什么?在没有任何解释的情况下,您的答案看起来几乎与powershell中的呼叫接线员相同。以下内容来自“特殊运算符”下的“获取有关_运算符的帮助”命令输出:&Call运算符运行命令、脚本或脚本块。调用运算符(也称为“调用运算符”)允许您运行存储在变量中并由字符串表示的命令。因为调用运算符不解析命令,所以它无法解释命令参数。“根据我的经验,进一步澄清一下,不包含它可能会导致参数由powershell.exe而不是脚本处理,或者通常会丢失。
<exec program="powershell" workingdir="${ifscriptrequires}" verbose="true">
    <arg line="-Command" />
    <arg line="$amp; C:\scripts\somescript.ps1 -SwitchParam -someargument 'somevalue' 'somepositionalparameter'" />
</exec>