2008-09-16 25 views
5

Bất cứ ai biết về bất kỳ tác vụ MSBuild nào tốt sẽ thực thi kịch bản PowerShell và chuyển các tham số khác nhau?Mọi tác vụ PowerShell MSBuild tốt?

Tôi đã có thể tìm thấy B# .NET Blog: Invoking PowerShell scripts from MSBuild, nhưng tôi hy vọng một điều gì đó được đánh bóng hơn một chút.

Nếu tôi không thể tìm thấy bất cứ điều gì tôi sẽ tất nhiên chỉ cần đi trước và đánh bóng của riêng tôi bằng cách sử dụng bài đăng blog đó như là một khởi đầu.

+0

Tôi muốn sử dụng bài đăng trên blog làm khởi động. Chúng tôi đang làm việc với một chuyên gia tư vấn của Microsoft và đó là bài đăng mà anh ấy đã giới thiệu cho chúng tôi. Tôi đã thử nhiệm vụ Powershell MSBuild trên codeplex, và nó sai sót trên một kịch bản Powershell của tôi hoạt động trong tác vụ của Bart De Smet. –

Trả lời

7

Bạn cũng có thể muốn xem Psake - môi trường xây dựng dựa trên PowerShell.

9
4

Duplicate Question and Answer I Posted, ở đây cho hậu thế khi được bỏ phiếu. Điểm khác biệt chính là câu hỏi này bị ràng buộc là OOTB và câu trả lời tự của tôi nằm trong giới hạn đó.

Câu hỏi

Powershell dường như không có một cách dễ dàng để kích hoạt nó với một lệnh tùy ý và sau đó bong bóng lên phân tích cú pháp và thực hiện sai sót trong một cách mà interoperates một cách chính xác với người gọi mà không phải là PowerShell - ví dụ, cmd.exe , TeamCity v.v.

Câu hỏi của tôi rất đơn giản. Cách tốt nhất cho tôi với OOTB MSBuild v4 và PowerShell v3 là gì? tinh chỉnh nó và/hoặc trở thành nó là người duy trì/cha mẹ ") để chạy một lệnh (hoặc một đoạn mã nhỏ, hoặc (phổ biến nhất) một lời gọi của một tập lệnh .ps1.

<Exec 
    IgnoreStandardErrorWarningFormat="true" 
    Command="PowerShell &quot;$(ThingToDo)&quot;" /> 

Đó buồn bã không hoạt động: -

  1. nếu ThingToDo thất bại trong việc phân tích, nó không âm thầm
  2. nếu ThingToDo là một invocation kịch bản đó không tồn tại, nó không
  3. nếu bạn muốn truyền một ERRORLEVEL dựa .cmd kết quả, nó được lông
  4. nếu bạn muốn nhúng " trích dẫn trong số ThingToDo, nó sẽ không hoạt động

Vì vậy, cách chứng minh bằng cách nào để chạy PowerShell từ MSBuild được cho là? Có điều gì tôi có thể PsGet để làm mọi thứ OK?

trả lời

Weeeeelll, bạn có thể sử dụng một cái gì đó dài hơi như thế này cho đến khi bạn tìm thấy một cách tốt hơn: -

<PropertyGroup> 
    <__PsInvokeCommand>powershell "Invoke-Command</__PsInvokeCommand> 
    <__BlockBegin>-ScriptBlock { $errorActionPreference='Stop';</__BlockBegin> 
    <__BlockEnd>; exit $LASTEXITCODE }</__BlockEnd> 
    <_PsCmdStart>$(__PsInvokeCommand) $(__BlockBegin)</_PsCmdStart> 
    <_PsCmdEnd>$(__BlockEnd)"</_PsCmdEnd> 
</PropertyGroup> 

Và sau đó 'tất cả' bạn cần phải làm là:

<Exec 
    IgnoreStandardErrorWarningFormat="true" 
    Command="$(_PsCmdStart)$(ThingToDo)$(_PsCmdEnd)" /> 

Tính năng mua lại đơn này (trừ bẫy tất cả các loại lỗi tôi có thể nghĩ đến), là nó hoạt động OOTB với bất kỳ phiên bản PowerShell nào và bất kỳ phiên bản MSBuild nào.

Tôi sẽ lấy áo khoác.

0

Với một chút niềm vui, tôi cố gắng tìm ra một cách khá sạch sẽ làm công việc này:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <!-- #1 Place this line at the top of any msbuild script (ie, csproj, etc) --> 
    <PropertyGroup><PowerShell># 2>nul || type %~df0|find /v "setlocal"|find /v "errorlevel"|powershell.exe -noninteractive -&amp; exit %errorlevel% || #</PowerShell></PropertyGroup> 

    <!-- #2 in any target you want to run a script --> 
    <Target Name="default" > 

    <PropertyGroup> <!-- #3 prefix your powershell script with the $(PowerShell) variable, then code as normal! --> 
     <myscript>$(PowerShell) 
     # 
     # powershell script can do whatever you need. 
     # 
     dir ".\*.cs" -recurse |% { 
     write-host Examining file named: $_.FullName 
     # do other stuff here... 
     } 
     $answer = 2+5 
     write-host Answer is $answer ! 
     </myscript> 
    </PropertyGroup> 

    <!-- #4 and execute the script like this --> 
    <Exec Command="$(myscript)" EchoOff="true" /> 
    </Target> 
</Project> 

Ghi chú:

  • Bạn vẫn có thể sử dụng các tính năng công tác Exec tiêu chuẩn! (Xem: https://msdn.microsoft.com/en-us/library/x8zx72cd.aspx)
  • nếu kịch bản PowerShell của bạn cần phải sử dụng <> hoặc & nhân vật, chỉ cần đặt các nội dung trong một wrapper CDATA:

    <script2><![CDATA[ $(PowerShell) 
        # your powershell code goes here! 
        write-host "<<Hi mom!>>" 
    ]]></script2> 
    
  • nếu bạn muốn quay trở lại mục vào kịch bản msbuild bạn có thể nhận được chúng:

    <script3>$(PowerShell) 
        # your powershell code goes here! 
        (dir "*.cs" -recurse).FullName 
    </script3> 
    
    <Exec Command="$(script3)" EchoOff="true" ConsoleToMSBuild="true"> 
        <Output TaskParameter="ConsoleOutput" PropertyName="items" /> 
    </Exec> 
    <Touch Files="$(items)" /> 
    

Xem! sau đó bạn có thể sử dụng các mục đó với một tác vụ msbuild khác: D

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