【问题标题】:What's a good way to consume a PowerShell Cmdlet in a NAnt build system?在 NAnt 构建系统中使用 PowerShell Cmdlet 的好方法是什么?
【发布时间】:2009-08-12 18:44:44
【问题描述】:

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

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

一些想法:

  • 使用exec 任务调用PowerShell? (虽然不确定这将如何工作)
  • 编写一个引用和使用 Cmdlet 的自定义 NAnt 任务?

有什么好的方法可以做到这一点?

【问题讨论】:

    标签: powershell build-automation nant


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案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>
        

        【讨论】:

          【解决方案4】:

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

          例如:

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

          【讨论】:

          • 能否请您澄清一下您对 & 符号的使用?没有解释,你的答案看起来和VJ M's answer几乎一样?
          • 与号是powershell中的调用运算符。以下来自特殊运算符下的“get-help about_operators”命令输出: '& 调用运算符 运行命令、脚本或脚本块。调用运算符,也称为“调用运算符”,可让您运行存储在变量中并由字符串表示的命令。因为调用运算符不解析命令,所以无法解释命令参数。'
          • 为了进一步澄清,根据我的经验,不包括它可能会导致参数由 powershell.exe 而不是脚本处理,或者通常只是丢失。
          猜你喜欢
          • 2011-04-20
          • 1970-01-01
          • 1970-01-01
          • 2010-11-01
          • 2010-11-09
          • 2010-12-28
          • 1970-01-01
          • 1970-01-01
          • 2017-08-27
          相关资源
          最近更新 更多