从powershell运行MSBuild而不指定.Net版本

时间:2015-06-10 10:37:34

标签: .net powershell msbuild azure-web-sites

我根据Scott Guthrie在此处解释的示例创建了一个用于部署我的Web应用程序的Powershell脚本Automate Everything (Building Real-World Cloud Apps with Azure) 它使用此MSBuild调用来构建和发布Web应用程序

& "$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 framework版本4.0.30319,并且对于其他版本(或将来的.Net安装)将失败

有没有办法运行这个MSBuild命令而不假设任何特定的.Net版本?

2 个答案:

答案 0 :(得分:3)

您可能希望从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位构建器,然后通过您想要的任何算法从列表中进行选择。 (我怀疑你有没有需要这个技巧。)

答案 1 :(得分:1)

你可以找到像这样的可用的MsBuild.exe文件

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

如果您对目录名称设置了其他限制,则可以对此oneliner进行更优化。

然后你可以实现你自己在这里选择版本的逻辑,并在没有找到任何东西时表现。例如,您可以使用与路径一起使用的正则表达式和/或.NET函数来选择最新的可能版本。