2013-01-10 35 views
19

Tôi hiện đang xem xét việc sửa đổi lại hệ thống triển khai cùng nhau của chúng tôi với một thứ gì đó thanh lịch hơn - Octopus. Trong khi làm như vậy, tôi đang cố gắng để có được VS để đóng gói lên một dự án khi một bản phát hành xây dựng được chạy. Vâng, tôi có kịch bản PowerShell ưa thích này được viết và làm việc, nhưng khi tôi thử EXEC từ tập lệnh msbuild, studio trực quan chỉ bị treo!Exec powershell.exe treo msbuild

Lúc đầu, tôi nghi ngờ cách thức công cụ đã được thoát trong vỏ, nhưng tôi đơn giản hóa nó một cách ridiculously, và nó vẫn đóng băng.

Dưới đây là đoạn code MSBuild liên quan:

<PropertyGroup> 
     <PowerShellExe Condition=" '$(PowerShellExe)'=='' "> 
     %WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe 
     </PowerShellExe> 
    </PropertyGroup> 

    <Target Name="AfterBuild" Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> 
     <Exec Command="$(PowerShellExe) -NonInteractive -executionpolicy Unrestricted -command get-childitem" /> 
    </Target> 

Tất cả những gì cần làm là đưa ra một danh sách thư mục. Kêu gọi này từ cmd.exe hoạt động tốt:

C:\Users\smithj>%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe -noninteractive -executionpolicy unrestricted -command dir 

Cố gắng này:

msbuild Solution.sln /p:Configuration=Release 

Gets tôi đây:

AfterBuild: 
    "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\\tf.exe" che 
    ckout Package.nuspec 
    Package.nuspec 

     %WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe 
     -NonInteractive -executionpolicy Unrestricted -command dir 

    Windows PowerShell 
    Copyright (C) 2009 Microsoft Corporation. All rights reserved. 

Sau đó, nó chỉ bị treo mãi mãi. Mọi đề xuất đều được chào đón.

Trả lời

28

Không chắc bạn sẽ thích câu trả lời. Sau một chút chơi, nó có vẻ là về sự mở rộng của nhóm bất động sản. Bạn đặt một dòng mới trong giá trị của PowerShellExe. Công trình này hoạt động tốt:

<PropertyGroup> 
    <PowerShellExe Condition=" '$(PowerShellExe)'=='' ">$(WINDIR)\System32\WindowsPowerShell\v1.0\powershell.exe</PowerShellExe> 
    </PropertyGroup> 

    <Target Name="AfterBuild"> 
    <Exec Command="$(PowerShellExe) -NonInteractive -executionpolicy bypass -command &quot;&amp;{get-childitem}&quot;" /> 
    </Target> 
+0

Vâng, tôi chắc chắn không thấy điều đó đến. Bạn hoàn toàn đúng. giống như dòng mới trong thuộc tính lệnh hoặc Dù sao, bạn nhấn móng trên đầu.Tôi đã dành hàng giờ trên này .. Nó luôn luôn là một cái gì đó ngu ngốc cuối cùng :) Cảm ơn bạn rất nhiều! – monkeybuffer

+0

np niềm vui của tôi. –

+0

Tôi đã chiến đấu với điều này trong nhiều giờ. Tôi muốn có một câu trả lời tốt hơn chỉ là "không đặt ngắt dòng trong tập tin msbuild." Tôi tự hỏi nếu một dấu chấm phẩy thêm hoặc một cái gì đó cuối cùng sẽ có được xung quanh này? Về cơ bản, tôi nghĩ rằng nó đang chờ đợi trên dòng chấm dứt được nhập giống như trong PowerShell khi bạn span nhiều dòng với ngắt dòng bạn phải đặt thêm một ở cuối. Dù bằng cách nào, những gì một sự nhẹ nhõm mà tôi có thể ít nhất là làm việc xung quanh này. Tôi ghét quay bánh xe của tôi trên loại công cụ này. – EdFred

0

Hãy thử:

<Exec Command='$(PowerShellExe) -NonInteractive -executionpolicy Unrestricted -command "& {Get-ChildItem}"' /> 
+1

Không súc sắc. Sao chép/dán chính xác tạo ra lỗi cú pháp, nhưng ngay cả sau khi thoát "&" với "&" nó vẫn chỉ treo: ( – monkeybuffer