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

发布于 2024-08-02 12:00:05 字数 613 浏览 8 评论 0原文

我们在构建系统中广泛使用 NAnt。最近,我编写了几个 PowerShell Cmdlet 来执行一些与数据库相关的操作。起初,这些 Cmdlet 的目的是不一定在我们的构建过程中运行。然而,这最近已成为一种需求,我们希望从基于 NAnt 的构建过程中运行其中一些 Cmdlet。

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

一些想法:

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

做到这一点的好方法是什么?

We use NAnt extensively for our build system. Recently, I've written a couple PowerShell Cmdlets to perform a few database related things. At first, the intent of these Cmdlets was not to necessarily run within our build process. However, this has recently become a need and we would like to run a few of these Cmdlets from our NAnt based build process.

These Cmdlets are written in C# and we have a SnapIn for them (if that matters at all).

A few ideas:

  • Use the exec task to call PowerShell? (not sure how this would work though)
  • Write a custom NAnt task that references and uses the Cmdlet?

What might be a good way to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

自由如风 2024-08-09 12:00:05

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

You can use the below exec task in your nant script to call your ps cmdlets.

<exec program="powershell" workingdir="${BuildManagementDir}" verbose="true">
    <arg value="-noprofile"/>
    <arg value="-nologo"/>
    <arg value="-noninteractive"/>
    <arg value="-command"/>
    <arg value=".\xyz.ps1"/>
</exec>
好倦 2024-08-09 12:00:05

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

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

You could certainly use the exec task, setting the program attribute to powershell.exe and passing in the command line something like "-Command { }".

Alternatively, you could create a custom NAnt task that internally uses the powershell hosting APIs to execute your cmdlets or scripts. There's a simple example of this (using the PS v1 APIs) here.

两仪 2024-08-09 12:00:05

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

Based on JiBe's answer its the other way around, here is the working solution. When running powershell that takes arguments you need to run the powershell script then the arguments.

PS yourscript.ps1 -arg1 value1 -arg2 value2

In NAnt:

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

The best way I think is to define the arguments in PS for NAnt is like

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

So in command line you will use:

PS yourscript.ps1 some_value1 some_value2

Then this translates in NAnt like:

<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>
雨巷深深 2024-08-09 12:00:05

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

例如:

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

The best way is to use similar methods as one would use in task scheduler. That means run powershell with the -command argument and begin the command with &.

For example:

<exec program="powershell" workingdir="${ifscriptrequires}" verbose="true">
    <arg line="-Command" />
    <arg line="$amp; C:\scripts\somescript.ps1 -SwitchParam -someargument 'somevalue' 'somepositionalparameter'" />
</exec>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文