2013-01-10 6 views
19

Attualmente sto esaminando il re-jigging del nostro sistema di distribuzione hacked insieme con qualcosa di un po 'più elegante - Octopus. Così facendo, sto cercando di convincere VS a confezionare un progetto quando viene eseguito un build di rilascio. Beh, ho scritto e lavorato questo fantastico script di PowerShell, ma quando provo a fare EXEC dallo script di msbuild, lo studio di visualizzazione si blocca!Exec powershell.exe si blocca msbuild

All'inizio sospettavo il modo in cui la roba veniva portata via nella shell, ma l'ho semplificata in modo ridicolo e si blocca ancora.

Ecco il codice MsBuild rilevanti:

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

tutto ciò che dovrebbe fare è dare un elenco di directory. La chiamata a questo da cmd.exe funziona bene:

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

Cercando questo:

msbuild Solution.sln /p:Configuration=Release 

mi fa questo:

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. 

Dopo di che, appena appende per sempre. Qualsiasi suggerimento è benvenuto.

risposta

28

Non sono sicuro che stai andando a come la risposta. Dopo un po 'di gioco, sembra riguardare l'espansione del gruppo di proprietà. Metti una nuova riga nel valore di PowerShellExe. Funziona così:

<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

Beh, di certo non l'ho visto arrivare. Hai perfettamente ragione. come newline nella proprietà del comando o, comunque, hai centrato la testa, ho passato ore su questo .. è sempre qualcosa di stupido alla fine :) Grazie mille! – monkeybuffer

+0

np mio piacere. –

+0

Ho combattuto con questo per ore. Vorrei che ci fosse una risposta migliore di "non mettere interruzioni di riga nel file msbuild". Mi chiedo se un punto e virgola in più o qualcosa finirebbero per aggirare questo? Fondamentalmente, penso che sia in attesa che la linea di terminazione venga immessa proprio come in PowerShell quando si estendono più linee con interruzioni di riga, è necessario aggiungerne un'altra alla fine. Ad ogni modo, che sollievo posso almeno aggirare questo. Odio girare le mie ruote su questo genere di cose. – EdFred

0

Prova:

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

Nessun dado. Una copia/incolla esatta produce un errore di sintassi, ma anche dopo essere uscito da "&" con "&" è ancora solo sospeso :( – monkeybuffer