使用PowerShell执行msbuild任务

5

我正在关注这篇博客: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


(注:该段文字可能是关于某个 IT 技术项目中的文件名称)
<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 

实际上,这已经满足了我的需求。

但是,如果有更独立或更好的方法,请发布它。

3个回答

9

在调用Invoke-Expression $msbuild之前,请确保您按以下方式定义PowerShell变量$msbuild。

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

1

如果你将从 Developer Command Prompt for VS... 到 Powershell 的所有 %PATH% 差异相加,那么你可以在 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了。


1
我最终采用以下方法构建了一个具有多个参数的解决方案。
&$msbuildExe ('solution.sln','/verbosity:q','/p:configuration=Release','/t:Clean,Build')
if (!$?) {
    echo "!!! ABORTING !!!";pause;exit    
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接