运行 来自 powershell 的 MSBuild 未指定 .Net 版本

Run MSBuild from powershell without specifying .Net version

我按照此处解释的 Scott Guthrie 示例创建了一个 Powershell 脚本来部署我的 Web 应用程序 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 安装)将失败

有没有办法在不假设任何特定 .Net 版本的情况下 运行 此 MSBuild 命令?

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

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

如果您对目录名称设置额外的限制,则可以进一步优化此 oneliner。

然后您可以实现自己的逻辑,即在此处选择版本并在完全找不到任何内容时进行操作。例如,您可以使用正则表达式 and/or 与路径一起使用的 .NET 函数来选择可能的最新版本。

您可能希望从 Powershell 本身找到所需的 .NET 生成器,因为它在基本命令集中有足够的工具。如果您使用另一个版本的 .NET Framework 来构建您的项目,可能会有一些技巧,例如缺少或 obsolete/deprecated classes、属性、方法,或者可能是语法更改或 class 依赖项将使您的项目无法在新的 .NET 版本下正确构建。但是,您可以尝试枚举构建器并找到最接近 v4.0.30319 的构建器。一个例子:

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

这将显示可用的 MSBuild.exe 文件名,这些文件名有资格构建您的项目。然后您解析 FrameworkFrameWork64 以获得 64 位或 32 位构建器,然后通过您喜欢的任何算法从列表中获取 select。 (我怀疑你永远需要这个技巧。)