运行的MSBuild从PowerShell中没有指定.NET版本

问题描述:

我创建了一个PowerShell脚本部署以下斯科特Guthrie的例子我的web应用程序在这里解释Automate Everything (Building Real-World Cloud Apps with Azure) 使用这个MSBuild的调用来构建和发布的Web应用程序运行的MSBuild从PowerShell中没有指定.NET版本

& "$env:windir\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" $ProjectCsproj ` 
/p:VisualStudioVersion=12.0 ` 
/p:DeployOnBuild=true ` 
/p:PublishProfile=$PublishXmlFile ` 
/p:Password=$Password 

由于你可以看到这个示例假设.Net框架版本4.0.30319,并且将在其他版本(或未来的.Net安装)中失败。

有没有一种方法可以运行此MSBuild命令而不会假设任何特定的.Net版本?

您可能希望从Powershell本身查找所需的.NET构建器,因为它在基本命令集中具有足够的工具。如果您使用其他版本的.NET Framework来构建项目,比如缺少或过时的/不推荐的类,属性,方法,或者可能会导致项目无法成为语法或类依赖关系的更改,则可能会有技巧在新的.NET版本下正确构建。但是,您可以尝试枚举构建器并找到最接近v4.0.30319的构建器。举个例子:

$builders= get-childitem "$env:windir\Microsoft.NET" -recurse -filter "MSBuild.exe" 
$builders | select -expand FullName 

此时将显示可用MSBuild.exe文件名,可以有资格建立你的项目。然后,解析FrameworkFrameWork64以获取64位或32位构建器,然后使用您喜欢的任何算法从列表中进行选择。 (我怀疑你是否会需要这个技巧)

+0

是的,Get-ChildItem中的-filter参数比使用ForEach-Object更快。 –

你可以找到可供MsBuild.exe文件,这样

Dir $env:windir\Microsoft.NET\Framework -Recurse -File | ? {$_.Name -like "MSBuild.exe"} | Resolve-Path 

这oneliner甚至更多,如果你设置的目录名的其他限制进行优化。

然后你可以在这里实现你自己选择版本的逻辑,当没有任何东西被发现时,你可以运行它。例如,您可以使用正则表达式和/或使用路径的.NET函数来选择最新版本。

+0

有趣的是,我不知道'dir'是'Get-ChildItem'的别名,我现在检查之前。 – Vesper

+0

它实际上在Windows管理员中很普遍。一般来说,在脚本中使用别名或者当你回答问题时是一种糟糕的风格,但是Dir实际上是一个例外) –