当前位置:  开发笔记 > 编程语言 > 正文

MSBuild的路径

如何解决《MSBuild的路径》经验,为你挑选了10个好方法。

我如何以编程方式从运行.exe的机器获取MSBuild的路径?

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



1> 小智..:

您还可以将MSBuild.exe的路径打印到命令行:

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


@VictorIonescu:您可以在`cmd`(或您正在运行的任何进程)的两个位上使用`/ reg:32`或`/ reg:64`来显式获取该路径.

2> Brian..:

看看注册表,它看起来像

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并查看.

通过命令行查询(根据Nikolay Botev)

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

通过PowerShell查询(根据MovGP0)

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


https://docs.microsoft.com/en-us/visualstudio/msbuild/what-s-new-in-msbuild-15-0"MSBuild现在安装在每个Visual Studio版本下的文件夹中.例如,C :\ Program Files(x86)\ Microsoft Visual Studio\2017\Enterprise\MSBuild"和"ToolsVersion值不再在注册表中设置"
的MSBuild 15位于`C:\ Program Files文件(x86)的\微软的Visual Studio\2017年\企业\的MSBuild\15.0 \斌\ AMD64 \`
我已安装Visual Studio 2017 RC并启动Developer Command Prompt,MSBuild版本为15. +,但此版本未显示在注册表中.如何访问Dev Cmd Prompt使用的相同MSBuild?
只有你在那里安装了VS2017,我在15.0工具集的MsBuildToolsPath注册表中找不到一个入口点
@ORMapper Microsoft提供了[GitHub上的项目](https://github.com/Microsoft/vswhere),用于确定* Visual Studio 2017 / msbuild 15.x *实例的路径。它是一个可执行文件,可以由您的构建软件/脚本使用。

3> AllenSanborn..:

如果要将MSBuild用于.Net 4,则可以使用以下PowerShell命令获取可执行文件的路径.如果你想要版本2.0或3.5,那么只需更改$ dotNetVersion变量.

要运行可执行文件,您需要在&前加上$ msbuild变量.那将执行变量.

# 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


[不适用于VS 2017,它不会在`HKLM:\ software\Microsoft\MSBuild\ToolsVersions`键下添加值.](https://docs.microsoft.com/en-us/visualstudio/msbuild/ what-s-new-in-msbuild-15-0)相反,你需要从`HKLM:\ SOFTWARE\WOW6432Node\Microsoft\VisualStud io\SxS\VS7\15.0`获取VS2017安装目录,然后追加`MSBuild\15.0\Bin\MSBuild.exe`获取MSBuild EXE位置.
适用于`$ dotNetVersion` 12.0(vs 2013)和14.0(vs 2015)(如果当然安装)

4> yoyo..:

对于Windows 7中的cmd shell脚本,我在批处理文件中使用以下片段在.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

对于我的用途,我退出批处理文件时出现错误,如果这不起作用:

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



5> dhcgn..:

您可以使用此试用版PowerShell命令MSBuildToolsPath从注册表中获取.

PowerShell(来自注册表)
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

或者来自文件系统

PowerShell(来自文件系统)
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



6> JJS..:

@AllenSanborn有一个很棒的PowerShell版本,但有些人要求只使用批处理脚本进行构建.

这是@ 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

对于Visual Studio 2017/MSBuild 15,Aziz Atif(编写Elmah的人)编写了一个批处理脚本

build.cmd Release Foo.csproj

https://github.com/linqpadless/LinqPadless/blob/master/build.cmd

@echo off
setlocal
if "%PROCESSOR_ARCHITECTURE%"=="x86" set PROGRAMS=%ProgramFiles%
if defined ProgramFiles(x86) set PROGRAMS=%ProgramFiles(x86)%
for %%e in (Community Professional Enterprise) do (
    if exist "%PROGRAMS%\Microsoft Visual Studio\2017\%%e\MSBuild\15.0\Bin\MSBuild.exe" (
        set "MSBUILD=%PROGRAMS%\Microsoft Visual Studio\2017\%%e\MSBuild\15.0\Bin\MSBuild.exe"
    )
)
if exist "%MSBUILD%" goto :restore
set MSBUILD=
for %%i in (MSBuild.exe) do set MSBUILD=%%~dpnx$PATH:i
if not defined MSBUILD goto :nomsbuild
set MSBUILD_VERSION_MAJOR=
set MSBUILD_VERSION_MINOR=
for /f "delims=. tokens=1,2,3,4" %%m in ('msbuild /version /nologo') do (
    set MSBUILD_VERSION_MAJOR=%%m
    set MSBUILD_VERSION_MINOR=%%n
)
if not defined MSBUILD_VERSION_MAJOR goto :nomsbuild
if not defined MSBUILD_VERSION_MINOR goto :nomsbuild
if %MSBUILD_VERSION_MAJOR% lss 15    goto :nomsbuild
if %MSBUILD_VERSION_MINOR% lss 1     goto :nomsbuild
:restore
for %%i in (NuGet.exe) do set nuget=%%~dpnx$PATH:i
if "%nuget%"=="" (
    echo WARNING! NuGet executable not found in PATH so build may fail!
    echo For more on NuGet, see https://github.com/nuget/home
)
pushd "%~dp0"
nuget restore ^
 && call :build Debug   %* ^
 && call :build Release %*
popd
goto :EOF

:build
setlocal
"%MSBUILD%" /p:Configuration=%1 /v:m %2 %3 %4 %5 %6 %7 %8 %9
goto :EOF

:nomsbuild
echo Microsoft Build version 15.1 (or later) does not appear to be
echo installed on this machine, which is required to build the solution.
exit /b 1


注意:由于VS2017/msbuild 15.x不使用注册表作为其路径,[vswhere](https://github.com/Microsoft/vswhere)是确定msbuild路径的替代方法.
另外,vswhere可以通过Chocolatey安装:https://chocolatey.org/packages/vswhere

7> Ian Kemp..:

查找MSBuild的说明:

"C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" -latest -prerelease -products * -requires Microsoft.Component.MSBuild -find MSBuild\**\Bin\MSBuild.exe

查找VSTest的说明:

"C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" -latest -prerelease -products * -requires Microsoft.VisualStudio.PackageGroup.TestTools.Core -find Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe

(请注意,上面的说明与Microsoft的官方说明略有不同。特别是,我包括了-prerelease允许使用Preview和RC安装以及-products *检测Visual Studio Build Tools安装的标记。)


仅用了两年时间,但终于在2019年,Microsoft倾听并给了我们找到这些重要可执行文件的方法!如果您已安装Visual Studio 2017和/或2019,则vswhere可以查询该实用程序以获取MSBuild等的位置。由于vswhere始终位于C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe,因此不再需要引导程序,也不需要进行路径硬编码。

魔法是在版本2.6.2中添加的-find参数。您可以通过运行或检查其文件属性来确定已安装的版本。如果您使用的是旧版本,则只需下载一个新版本并覆盖现有版本即可。vswhereC:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe

vswhere.exe是一个独立的可执行文件,因此您可以从具有Internet连接的任何位置下载并运行它。这意味着您的构建脚本可以检查运行它们的环境是否正确设置(仅举一个选项)。


现在4。我发现此答案很有帮助,而我找不到其他vswhere答案。

8> Paulo Santos..:

注册表位置

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

给出可执行文件的位置.

但是,如果您需要保存任务扩展的位置,它就会打开

%ProgramFiles%\MSBuild


它已经很老了,我知道 - 但无论如何:在x64-Systems上,MSBuild-Folder位于ProgramFiles(x86)中

9> Raman Zhylic..:

这适用于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

}


对于VS2017,另请参阅:https://github.com/Microsoft/vswhere,https://github.com/Microsoft/vssetup.powershell和https://github.com/deadlydog/Invoke-MsBuild
对于构建工具,请使用https://github.com/Microsoft/vswhere/wiki/Find-MSBuild中指定的`vswhere -products*`.

10> MovGP0..:

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

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

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有