19

我目前正在考虑用更优雅的东西 - Octopus 重新构建我们被黑客攻击的部署系统。在这样做时,我试图让 VS 在运行发布版本时打包一个项目。好吧,我已经编写并运行了这个精美的 powershell 脚本,但是当我尝试从 msbuild 脚本执行时,Visual Studio 就挂了!

起初我怀疑东西在 shell 中的逃逸方式,但我荒谬地简化了它,它仍然冻结。

这是相关的 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>

它应该做的就是提供一个目录列表。从 cmd.exe 调用它可以正常工作:

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

试试这个:

msbuild Solution.sln /p:Configuration=Release

得到我这个:

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.

在那之后,它就永远挂起。欢迎任何建议。

4

2 回答 2

28

不确定你会喜欢这个答案。玩了一会儿,似乎是关于属性组的扩张。您在 PowerShellExe 的值中添加了一个新行。这工作正常:

<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>
于 2013-01-11T11:58:30.303 回答
0

尝试:

<Exec Command='$(PowerShellExe) -NonInteractive -executionpolicy Unrestricted -command "& {Get-ChildItem}"' />
于 2013-01-11T00:01:37.287 回答