【问题标题】:Executing msbuild task from powershell从 powershell 执行 msbuild 任务
【发布时间】:2013-12-18 10:22:27
【问题描述】:

我正在关注这个博客:http://sedodream.com/2010/04/26/ConfigTransformationsOutsideOfWebAppBuilds.aspx

它在这个问题中作为答案链接:Web.Config transforms outside of Microsoft MSBuild?

每个步骤都按描述进行,但我想从 powershell 脚本调用转换。 我想在 powershell msbuild trans.proj /t:Demo 中执行此命令 我发现一些论坛说我应该使用invoke-expression

当我尝试时,我得到了这个错误

Powershell:

Invoke-Expression $msbuild transformCommand.proj /t:Demo

结果

Invoke-Expression : Cannot bind argument to parameter 'Command' because it is null.
At D:/Somewhere
+ Invoke-Expression <<<<  $msbuild transformCommand.proj /t:Demo
    + CategoryInfo          : InvalidData: (:) [Invoke-Expression], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.InvokeExpre
   ssionCommand

我也试过了:

Invoke-Expression msbuild transformCommand.proj /t:Demo

有结果

 D:\Somewhere
Invoke-Expression : A positional parameter cannot be found that accepts argument 'transformCommand.proj'.
At D:\Redgate\Communited.Timeblockr.Api\PreDeploy1.ps1:14 char:18
+ Invoke-Expression <<<<  msbuild transformCommand.proj /t:Demo
    + CategoryInfo          : InvalidArgument: (:) [Invoke-Expression], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.InvokeExpressionCommand

小记:这是我第一次使用powershell。

TransformCommand.proj

<Project ToolsVersion="4.0" DefaultTargets="Demo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <UsingTask TaskName="TransformXml"
             AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/>
    <Target Name="Demo">
        <TransformXml Source="Web.Test.config"
                      Transform="transform.xml"
                      Destination="Web.acceptatie.config"/>
    </Target>
</Project>

我的问题是: 这可能吗?这怎么可能?

编辑:

$a = "Path\transformCommand.proj /t:Demo"
#Invoke-Expression $msbuild $a

Start-Process -FilePath "C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe" -ArgumentList $a | Write-Host 

这实际上做了我需要的一切..

如果有更“独立”或更好的方法可以做到这一点,请发布。

【问题讨论】:

    标签: msbuild powershell-2.0


    【解决方案1】:

    确保在调用 Invoke-Expression $msbuild 之前定义 PowerShell 变量 $msbuild 如下所示

    $msbuild = "C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe"
    

    【讨论】:

      【解决方案2】:

      我最终执行了以下操作来构建具有多个参数的解决方案

      &$msbuildExe ('solution.sln','/verbosity:q','/p:configuration=Release','/t:Clean,Build')
      if (!$?) {
          echo "!!! ABORTING !!!";pause;exit    
      }
      

      【讨论】:

        【解决方案3】:

        如果您将 %PATH%Developer Command Prompt for VS... 的所有差异添加到 powershell,那么您可以像在命令提示符中一样在 powershell 中运行 msbuild,一切似乎都可以正常工作。您还需要复制变量%VCInstallDir%

        这是我编写的一个 powershell 函数,用于获取差异。

        function Find-Path-Differences {
            $defaultPath = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
            $env:path.split(';') | Sort-Object -Unique | Where-Object { $defaultPath.split(';') -notcontains $_ }  | Foreach-Object { "`$env:path += `";$_`"`r" } | echo
            echo "function VCInstallDir {return `"$VCInstallDir`"}`r"
        }
        

        如果你打开 powershell 并输入echo $profile,它会给你一个文件路径。创建或打开文件,然后将函数粘贴到其中,当powershell启动时,该函数将可用。然后在Developer Command Prompt ... 运行这个命令:

        powershell Find-Path-Differences
        

        然后会弹出一堆这样的行:

        $env:path += ";C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\\MSBuild\15.0\bin"
        ...
        $env:path += ";C:\Windows\Microsoft.NET\Framework\v4.0.30319"
        

        将这些行从echo $profile 复制并粘贴到文件中,然后打开一个新的powershell 窗口,您现在可以在powershell 中使用msbuild

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-09
          • 2011-04-23
          • 2014-01-26
          • 2010-12-06
          • 1970-01-01
          相关资源
          最近更新 更多