2009-08-12 37 views
6

Chúng tôi sử dụng NAnt rộng rãi cho hệ thống xây dựng của chúng tôi. Gần đây, tôi đã viết một vài số PowerShell Cmdlets để thực hiện một vài điều liên quan đến cơ sở dữ liệu. Lúc đầu, ý định của các Cmdlets này là không phải để nhất thiết phải chạy trong quá trình xây dựng của chúng tôi. Tuy nhiên, điều này gần đây đã trở thành một nhu cầu và chúng tôi muốn chạy một vài trong số các Cmdlets này từ quá trình xây dựng dựa trên NAnt của chúng tôi.Cách tốt nhất để sử dụng PowerShell Cmdlet trong hệ thống xây dựng NAnt là gì?

Các Cmdlet này được viết bằng C# và chúng tôi có SnapIn cho chúng (nếu có vấn đề gì).

Một vài ý tưởng:

  • Sử dụng các nhiệm vụ exec gọi PowerShell? (không chắc chắn cách thức này sẽ hoạt động)
  • Viết tác vụ NAnt tùy chỉnh tham chiếu và sử dụng Cmdlet?

Điều gì có thể là cách hay để thực hiện việc này?

Trả lời

5

Bạn chắc chắn có thể sử dụng tác vụ exec, đặt thuộc tính chương trình thành powershell.exe và chuyển vào dòng lệnh như "-Command {}".

Ngoài ra, bạn chắc chắn có thể tạo một nhiệm vụ tùy chỉnh NAnt trong đó sử dụng API lưu trữ quyền hạn để thực thi lệnh ghép ngắn hoặc tập lệnh của bạn. Có một ví dụ đơn giản về điều này (sử dụng API PS v1) here.

8

Bạn có thể sử dụng tác vụ exec bên dưới trong tập lệnh nant để gọi lệnh ghép ngắn ps của bạn.

<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

Dựa trên câu trả lời của JiBe theo cách khác, đây là giải pháp làm việc. Khi chạy PowerShell lấy các đối số, bạn cần chạy script PowerShell sau đó là các đối số.

PS yourscript.ps1 -arg1 value1 -arg2 value2 

Trong Nant:

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

Cách tốt nhất tôi nghĩ là để xác định các đối số trong PS cho Nant là như

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

Vì vậy, trong dòng lệnh bạn sẽ sử dụng:

PS yourscript.ps1 some_value1 some_value2 

Sau đó, dịch này được hiển thị trong NAnt li 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

Cách tốt nhất là sử dụng các phương pháp tương tự như phương pháp sẽ sử dụng trong công cụ lập lịch tác vụ. Điều đó có nghĩa là chạy powershell với đối số -command và bắt đầu lệnh với &.

Ví dụ:

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

Ông có thể làm rõ việc bạn sử dụng dấu và? Nếu không có một lời giải thích, câu trả lời của bạn trông khá giống với câu trả lời của [câu trả lời của VJ] (http://stackoverflow.com/a/4311491/622391)? –

+0

Dấu và là toán tử cuộc gọi trong PowerShell. Sau đây là từ đầu ra lệnh 'get-help about_operators' trong các toán tử đặc biệt: '& Gọi toán tử Chạy lệnh, tập lệnh hoặc khối tập lệnh.Toán tử cuộc gọi, còn được gọi là toán tử gọi "," cho phép bạn chạy các lệnh được lưu trữ trong các biến số và được biểu diễn bằng chuỗi. Bởi vì toán tử cuộc gọi không phân tích lệnh, nó không thể diễn giải các tham số lệnh. ' –

+1

Để làm rõ thêm, Theo kinh nghiệm của tôi, không bao gồm nó có thể gây ra các đối số được xử lý bởi powershell.exe thay vì tập lệnh hoặc chỉ bị mất nói chung. –

Các vấn đề liên quan