MSBuild的path

我怎样才能从我的.exe运行的机器上编程获取MSBuild的path?

我可以从环境中获得.NET版本,但有没有办法为.NET版本获取正确的文件夹?

围绕registry,看起来像

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\2.0 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\3.5 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0 

可能是你在做什么; 启动regedit.exe并看看。

您也可以将MSBuild.exe的path打印到命令行中:

 reg.exe query "HKLM\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0" /v MSBuildToolsPath 

对于Windows 7中的cmd shell脚本,我在我的batch file中使用以下片段来查找.NET Framework版本4中的MSBuild.exe。我假定版本4存在,但不要假设子版本。 这不是完全通用的,但对于快速脚本可能有帮助:

 set msbuild.exe= for /D %%D in (%SYSTEMROOT%\Microsoft.NET\Framework\v4*) do set msbuild.exe=%%D\MSBuild.exe 

对于我的用途,我退出batch file,如果不起作用的话,会报错:

 if not defined msbuild.exe echo error: can't find MSBuild.exe & goto :eof if not exist "%msbuild.exe%" echo error: %msbuild.exe%: not found & goto :eof 

如果你想使用MSBuild for .Net 4,那么你可以使用下面的PowerShell命令获取可执行文件的path。 如果你想要版本2.0或3.5,那么只需改变$ dotNetVersionvariables。

要运行可执行文件,你需要在$前面加上$。 这将执行该variables。

 # valid versions are [2.0, 3.5, 4.0] $dotNetVersion = "4.0" $regKey = "HKLM:\software\Microsoft\MSBuild\ToolsVersions\$dotNetVersion" $regProperty = "MSBuildToolsPath" $msbuildExe = join-path -path (Get-ItemProperty $regKey).$regProperty -childpath "msbuild.exe" &$msbuildExe 

@AllenSanborn有一个很棒的powershell版本,但有些人只需要使用批处理脚本进行构build。

这是@ bono8106回答的应用版本。

msbuildpath.bat

 @echo off reg.exe query "HKLM\SOFTWARE\Microsoft\MSBuild\ToolsVersions\14.0" /v MSBuildToolsPath > nul 2>&1 if ERRORLEVEL 1 goto MissingMSBuildRegistry for /f "skip=2 tokens=2,*" %%A in ('reg.exe query "HKLM\SOFTWARE\Microsoft\MSBuild\ToolsVersions\14.0" /v MSBuildToolsPath') do SET "MSBUILDDIR=%%B" IF NOT EXIST "%MSBUILDDIR%" goto MissingMSBuildToolsPath IF NOT EXIST "%MSBUILDDIR%msbuild.exe" goto MissingMSBuildExe exit /b 0 goto:eof ::ERRORS ::--------------------- :MissingMSBuildRegistry echo Cannot obtain path to MSBuild tools from registry goto:eof :MissingMSBuildToolsPath echo The MSBuild tools path from the registry '%MSBUILDDIR%' does not exist goto:eof :MissingMSBuildExe echo The MSBuild executable could not be found at '%MSBUILDDIR%' goto:eof 

运行build.bat

 @echo off call msbuildpath.bat "%MSBUILDDIR%msbuild.exe" foo.csproj /p:Configuration=Release 

您可以使用这个非常小的PowerShell命令从registry中获取MSBuildToolsPath

电源shell:

 Resolve-Path HKLM:\SOFTWARE\Microsoft\MSBuild\ToolsVersions\* | Get-ItemProperty -Name MSBuildToolsPath 

输出:

 MSBuildToolsPath : C:\Program Files (x86)\MSBuild\12.0\bin\amd64\ PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\12.0 PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions PSChildName : 12.0 PSDrive : HKLM PSProvider : Microsoft.PowerShell.Core\Registry MSBuildToolsPath : C:\Program Files (x86)\MSBuild\14.0\bin\amd64\ PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\14.0 PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions PSChildName : 14.0 PSDrive : HKLM PSProvider : Microsoft.PowerShell.Core\Registry MSBuildToolsPath : C:\Windows\Microsoft.NET\Framework64\v2.0.50727\ PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\2.0 PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions PSChildName : 2.0 PSDrive : HKLM PSProvider : Microsoft.PowerShell.Core\Registry MSBuildToolsPath : C:\Windows\Microsoft.NET\Framework64\v3.5\ PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\3.5 PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions PSChildName : 3.5 PSDrive : HKLM PSProvider : Microsoft.PowerShell.Core\Registry MSBuildToolsPath : C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0 PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions PSChildName : 4.0 PSDrive : HKLM PSProvider : Microsoft.PowerShell.Core\Registry 

或从文件系统

电源shell:

 Resolve-Path "C:\Program Files (x86)\MSBuild\*\Bin\amd64\MSBuild.exe" Resolve-Path "C:\Program Files (x86)\MSBuild\*\Bin\MSBuild.exe" 

输出:

 Path ---- C:\Program Files (x86)\MSBuild\12.0\Bin\amd64\MSBuild.exe C:\Program Files (x86)\MSBuild\14.0\Bin\amd64\MSBuild.exe C:\Program Files (x86)\MSBuild\12.0\Bin\MSBuild.exe C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe 

registry位置

 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\2.0 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\3.5 

给可执行文件的位置。

但是,如果您需要保存任务扩展的位置,则该位置处于打开状态

 %ProgramFiles%\MSBuild 

在Windows 2003和更高版本上,在cmd中键入以下命令:

 cmd> where MSBuild Sample result: C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe 

如果什么都没有出现,这意味着.NET框架不包含在系统PATH中。 MSBuild应该在.NET安装文件夹中,以及.NET编译器(vbc.exe,csc.exe)

这适用于Visual Studio 2015和2017年:

 function Get-MSBuild-Path { $vs14key = "HKLM:\SOFTWARE\Microsoft\MSBuild\ToolsVersions\14.0" $vs15key = "HKLM:\SOFTWARE\wow6432node\Microsoft\VisualStudio\SxS\VS7" $msbuildPath = "" if (Test-Path $vs14key) { $key = Get-ItemProperty $vs14key $subkey = $key.MSBuildToolsPath if ($subkey) { $msbuildPath = Join-Path $subkey "msbuild.exe" } } if (Test-Path $vs15key) { $key = Get-ItemProperty $vs15key $subkey = $key."15.0" if ($subkey) { $msbuildPath = Join-Path $subkey "MSBuild\15.0\bin\amd64\msbuild.exe" } } return $msbuildPath } 

最简单的方法可能是打开PowerShell并input

 dir HKLM:\SOFTWARE\Microsoft\MSBuild\ToolsVersions\ 

您可以获取.NET版本并获取特定版本:

HKEY_LOCAL_MACHINE \ SOFTWARE \微软\的MSBuild \ ToolsVersions

这是registry位置

从MSBuild 2017(v15)开始,MSBuild现在安装在每个Visual Studio版本下的一个文件夹中,不再在registry中设置

以下是在我的机器上findMSBuild.exe的一些示例:

 C:\windows\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe (v2.0.50727.8745 32-bit) C:\windows\Microsoft.NET\Framework64\v2.0.50727\MSBuild.exe (v2.0.50727.8745 64-bit) C:\Windows\Microsoft.NET\Framework\v3.5\MSBuild.exe (v3.5.30729.8763 32-bit) C:\Windows\Microsoft.NET\Framework64\v3.5\MSBuild.exe (v3.5.30729.8763 64-bit) C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe (v4.7.2053.0 32-bit) C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe (v4.7.2053.0 64-bit) C:\Program Files (x86)\MSBuild\12.0\Bin\MSBuild.exe (v12.0.21005.1 32-bit) C:\Program Files (x86)\MSBuild\12.0\Bin\amd64\MSBuild.exe (v12.0.21005.1 64-bit) C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe (v14.0.25420.1 32-bit) C:\Program Files (x86)\MSBuild\14.0\Bin\amd64\MSBuild.exe (v14.0.25420.1 64-bit) C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\MSBuild.exe (v15.1.1012+g251a9aec17 32-bit) C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\amd64\MSBuild.exe (v15.1.1012+g251a9aec17 64-bit) C:\Program Files (x86)\Microsoft Visual Studio\2017\{LicenceName}\MSBuild\Bin\MSBuild.exe (v15.1.1012.6693 32-bit) C:\Program Files (x86)\Microsoft Visual Studio\2017\{LicenceName}\MSBuild\Bin\amd64\MSBuild.exe (v15.1.1012.6693 64-bit) 

如果你想编译一个Delphi项目, 在使用msbuild + Delphi2009时请看“错误MSB4040项目中没有目标”

正确的答案是:“有一个名为rsvars.bat的batch file(在RAD Studio文件夹中search它)。在调用MSBuild之前调用它,它将设置必要的环境variables。确保rsvars中的文件夹是正确的.bat如果你的编译器位于默认的不同位置。

这个蝙蝠不仅将PATH环境variables更新到适当的MSBuild.exe版本的.NET文件夹,而且还会注册其他必要的variables。