2013-01-10 24 views
19

Obecnie szukam możliwości ponownego połączenia naszego zhackowanego systemu wdrażania z czymś nieco bardziej eleganckim - Octopus. Czyniąc to, próbuję zmusić VS do spakowania projektu po uruchomieniu kompilacji wydania. No cóż, mam napisany i działający fantazyjny skrypt powershell, ale kiedy próbuję EXEC ze skryptu msbuild, visual studio po prostu wisi!Exec powershell.exe zawiesza się msbuild

Początkowo podejrzewałem, że w powłoce uciekł materiał, ale uprościłem go niedorzecznie i nadal się zawiesza.

Oto odpowiedni kod MSBuild:

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

Wszystko należy zrobić, to dać listę katalogów. Wywołanie to od cmd.exe działa dobrze:

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

Trying to:

msbuild Solution.sln /p:Configuration=Release 

Pobiera mi to:

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. 

Po tym, to po prostu wisi na zawsze. Wszelkie sugestie są mile widziane.

Odpowiedz

28

Nie na pewno spodoba ci odpowiedź. Po krótkiej grze wydaje się, że chodzi o rozszerzenie grupy właściwości. Wstawiasz nową linię do wartości PowerShellExe. To działa dobrze:

<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

Cóż, na pewno nie widziałem, że nadchodzi.Jesteś absolutnie rację.Nawiasem mówiąc to nie jak nowe linie w komendzie właściwości, w każdym razie trafiłeś w sedno, spędziłem wiele godzin na tym ... To zawsze coś głupiego na końcu :) Dziękuję bardzo! – monkeybuffer

+0

np. Moja przyjemność. –

+0

Walczyłem z tym przez wiele godzin. Szkoda, że ​​nie było lepszej odpowiedzi niż po prostu "nie umieszczaj podziałów linii w pliku msbuild". Zastanawiam się, czy dodatkowy średnik lub coś ostatecznie się z tym obejdzie? Zasadniczo, myślę, że czeka na podanie linii końcowej, tak jak w PowerShell, kiedy rozciągasz wiele linii z liniowymi przerwami, musisz na końcu umieścić dodatkowy. Tak czy inaczej, co za ulga, że ​​mogę przynajmniej obejść to. Nienawidzę obracać kółek na tego rodzaju rzeczy. – EdFred

0

Spróbuj:

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

Bez kostki. Dokładne skopiowanie/wklejenie powoduje błąd składni, ale nawet po wyjściu z "&" z "&" nadal się po prostu wisi :( – monkeybuffer