MSBuild의 경로


186

내 .exe가 실행되는 컴퓨터에서 프로그래밍 방식으로 MSBuild 경로를 얻는 방법은 무엇입니까?

환경에서 .NET 버전을 얻을 수 있지만 .NET 버전의 올바른 폴더를 얻는 방법이 있습니까?

답변:


141

레지스트리를 파고 들어간 것처럼 보입니다.

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\

5
Visual Studio 2017 RC를 설치하고 개발자 명령 프롬프트를 시작했는데 MSBuild 버전은 15. +이지만이 버전은 레지스트리에 표시되지 않습니다. Dev Cmd Prompt에서 사용하는 것과 동일한 MSBuild에 액세스하려면 어떻게해야합니까?
SuperJMN

6
MSBuild 15는 C : \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Enterprise \ MSBuild \ 15.0 \ Bin \ amd64에 있습니다.
nZeus

2
VS2017을 설치 한 경우에만 15.0 툴셋에 대한 MsBuildToolsPath의 레지스트리에서 단일 진입 점을 찾을 수 없었습니다
Paciv

8
docs.microsoft.com/ko-kr/visualstudio/msbuild/… "MSBuild는 이제 각 버전의 Visual Studio 아래에있는 폴더에 설치됩니다. 예를 들어 C : \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Enterprise \ MSBuild "및"ToolsVersion 값이 더 이상 레지스트리에 설정되지 않음 "
Hulvej

2
@ORMapper Microsoft는 Visual Studio 2017 / msbuild 15.x 인스턴스의 경로를 결정하기위한 GitHub 프로젝트를 제공 합니다. 빌드 소프트웨어 / 스크립트에서 사용할 수있는 단일 실행 파일입니다.
Roi Danton

140

MSBuild.exe의 경로를 명령 줄에 인쇄 할 수도 있습니다.

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

1
Windows Phone 앱을 빌드하려면 32 비트 msbuild가 필요합니다. 레지스트리를 쿼리하면 64 비트 컴퓨터에서 64 비트 msbuild 만 제공됩니다.
Victor Ionescu

2
@VictorIonescu : 당신은 명시 적으로 그 경로를 얻기 위해 (또는 실행중인 프로세스의) bitnessess를 사용 /reg:32하거나 /reg:64둘 다 사용할 수 있습니다 cmd.
Simon Buchan

이것은 당신에게 오래된 (4.0) 위치에 대한 경로를 줄 것입니다-아마 당신이 원하는 곳은 실제로 다른 곳에 있습니다 stackoverflow.com/questions/32007871/…
JonnyRaa

내 경우에 그것은 아래 있었다Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\MSBuild\ToolsVersions\4.0\MSBuildToolsPath
Sen Jacob

32

.Net 4 용 MSBuild를 사용하려면 다음 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

2
$dotNetVersion12.0 (2013 년 대) 및 14.0 (2015 년 대) 에서도 작동합니다 (물론 설치된 경우)
Julian

4
VS 2017에서는 작동하지 않으며 HKLM:\software\Microsoft\MSBuild\ToolsVersions키 아래에 값을 추가하지 않습니다 . 대신 VS2017 설치 디렉토리를 HKLM:\SOFTWARE\WOW6432Node\Microsoft\VisualStud‌​io\SxS\VS7\15.0에서 가져온 다음 MSBuild\15.0\Bin\MSBuild.exeMSBuild EXE 위치를 얻기 위해 추가 해야합니다.
Ian Kemp

30

Windows 7의 cmd 셸 스크립팅의 경우 배치 파일에서 다음 조각을 사용하여 .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

@yoyo는 무엇입니까 set bb.build.msbuild.exe=? 필수입니까 아니면 설정의 인공물입니까?
Elisée

@ Elisée 죄송합니다. 복사 / 붙여 넣기 오타입니다. 내 환경에서 변수 bb.build.msbuild.exe를 호출하면 대답에 붙여 넣을 때 해당 인스턴스를 수정하지 않았습니다. 지적 해 주셔서 감사합니다.
yoyo

26

이 평가판 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

1
이 주제에 대한 최고의 답변.
Teoman shipahi

21

MSBuild를 찾는 방법 :

  • PowerShell : &"${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" -latest -prerelease -products * -requires Microsoft.Component.MSBuild -find MSBuild\**\Bin\MSBuild.exe
  • CMD : "%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -prerelease -products * -requires Microsoft.Component.MSBuild -find MSBuild\**\Bin\MSBuild.exe

VSTest를 찾는 방법 :

  • PowerShell : &"${env:ProgramFiles(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
  • CMD : "%ProgramFiles(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의 공식 지침에서 약간 수정되었습니다. 특히, -prereleasePreview 및 RC 설치를 선택하고 -products *Visual Studio Build Tools 설치를 감지 할 수 있는 플래그를 포함 시켰 습니다 .)


단 2 년이 걸렸지 만 2019 년에 Microsoft는 이러한 중요한 실행 파일을 찾을 수있는 방법을 들었습니다 . Visual Studio 2017 및 / 또는 2019를 설치 한 경우 vswhereMSBuild 등의 위치에 대한 유틸리티를 쿼리 할 수 ​​있습니다. vswhere 는에 항상 위치 하므로 %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe부트 스트랩이없고 더 이상 경로 하드 코딩이 필요하지 않습니다.

마법은 버전 2.6.2에 추가 된-find 매개 변수 입니다. 을 실행 하거나 파일 속성을 확인하여 설치 한 버전을 확인할 수 있습니다 . 이전 버전이있는 경우 최신 버전을 다운로드하여 기존 버전을 덮어 쓸 수 있습니다 .vswhere%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe

vswhere.exe는 독립 실행 형 실행 파일이므로 인터넷에 연결되어있는 어느 곳에서나 다운로드하여 실행할 수 있습니다. 즉, 빌드 스크립트가 실행중인 환경이 올바르게 설정되어 있는지 확인하여 하나의 옵션을 지정할 수 있습니다.


vswhere에 대한 답변은 이미 그중 하나에 해당되는 의견을 포함하여 3 가지 있습니다. 이 답변을 추가하면 답변 수프가 악화됩니다.
jpaugh

4
지금 4입니다. 이 답변이 도움이되었지만 다른 답변은 도움이되지 않았습니다.
cowlinator 2016 년

VSWHERE가 사용할 msbuild.exe라고 말했기 때문에 msbuild명령 줄 (특히 Visual Studio 명령 줄을 사용하는 경우)을 입력하면 이것이 사용될 것임을 의미하지는 않습니다 . msbuild명령 행에 입력하면 무엇이 사용되는지 확인하려면 다음과 같이하십시오 where msbuild. 그것이 VSWHERE가 최신 및 가장 큰 것이라고 말한 것과 동일하게보고하지 않으면 msbuild.exe사용하려는 전체 경로를 수행 하거나 PATH 변수를 조정해야합니다.
Jinlye

다음 질문은 당신이 어디로가는 길을 찾는가입니다 ....
BJury

17

@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

2
참고 : VS2017 / msbuild 15.x는 경로에 레지스트리를 사용하지 않으므로 vswhere 는 msbuild 경로를 결정하는 대안입니다.
Roi Danton

1
또한 AzizAtif는 사람입니다. 15.1이에서 수컷 거위를 타고하는 빌드 - github.com/linqpadless/LinqPadless/blob/master/build.cmd
JJS

2
또한 Chocolatey를 통해 vswhere를 설치할 수 있습니다 : chocolatey.org/packages/vswhere
cowlinator

6

이것은 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

}


3
빌드 도구의 경우 github.com/Microsoft/vswhere/wiki/Find-MSBuild에vswhere -products * 지정된 대로을 사용하십시오 .
TN.

vswhere의 경우 경로가 어디인지 알아야합니다. 물론 빌드 시스템에 사용할 수있는 파워 쉘이 있어야합니다. 단 하나의 질문 : 왜 amd64입니까? 건물에 특정한 것이 있습니까?
Maxim

이 솔루션은 본질적으로 타사 라이브러리 또는 스크립트가 아닌 MSBuild 15의 레지스트리 키만 사용하기 때문에 피투성이되었습니다. 호기심에서 "SxS \ VS7"은 무엇을 의미합니까? VS 버전에서도 유효합니까?
Lazlo

5

레지스트리 위치

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

실행 파일의 위치를 ​​지정하십시오.

그러나 작업 확장을 저장할 위치가 필요한 경우 켜져 있습니다.

%ProgramFiles%\MSBuild

4
꽤 오래된 것입니다. 그러나 어쨌든 : x64 시스템에서 MSBuild-Folder는 ProgramFiles (x86)에 있습니다
Sascha

4

가장 쉬운 방법은 PowerShell을 열고 입력하는 것입니다.

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

4

@dh_cgn의 답변을 기반으로 한 라이너 :

(Resolve-Path ([io.path]::combine(${env:ProgramFiles(x86)}, 'Microsoft Visual Studio', '*', '*', 'MSBuild', '*' , 'bin' , 'msbuild.exe'))).Path

예를 들어 기존의 모든 경로 경로를 선택합니다. C:\Program Files (x86)\Microsoft Visual Studio\*\*\MSBuild\*\bin\msbuild.exe.

와일드 카드 별은 다음과 같습니다.

  • 올해 (2017)
  • 비주얼 스튜디오 에디션 (커뮤니티, 프로페셔널, 엔터프라이즈)
  • 도구 버전 (15.0)

이 명령은 알파벳 순서로 표시되는 표현식과 일치하는 첫 번째 경로를 선택합니다. 좁히려면 와일드 카드를 특정 요소로 바꾸십시오 (예 : 연도 또는 도구 버전.


3

Windows 2003 이상에서 cmd에 다음 명령을 입력하십시오.

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

아무것도 나타나지 않으면 .NET 프레임 워크가 시스템 PATH에 포함되지 않은 것입니다. MSBuild는 .NET 컴파일러 (vbc.exe, csc.exe)와 함께 .NET 설치 폴더에 있어야합니다.


이 답변은 다른 답변보다 많이 추가되지 않습니다. 이 답변
jpaugh

3

MSBuild 2017 (v15)부터는 MSBuild가 각 버전의 Visual Studio 아래 폴더에 설치됩니다.

내 컴퓨터에서 MSBuild.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)

이전 답변 에 따르면 2017 실제로이 정보를 레지스트리에 저장합니다.
jpaugh

2

추가 도구없이 레지스트리에서 배치를 사용하여 msbuild 15 (Visual Studio 2017)의 경로를 검색하려면

set regKey=HKLM\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\SxS\VS7
set regValue=15.0
for /f "skip=2 tokens=3,*" %%A in ('reg.exe query %regKey% /v %regValue% 2^>nul') do (
    set vs17path=%%A %%B
)
set msbuild15path = %vs17path%\MSBuild\15.0\Bin\MSBuild.exe

더 나은 도구 :


1
당신은 내 생명을 구했습니다
Hakan Fıstık

PowerShell 버전 이 이미 있습니다 . 2017 년경 Powershell 학습을 피할 이유가 있습니까?
jpaugh

2
@jpaugh 모든 빌드 시스템에서 PowerShell을 사용할 수있는 것은 아닙니다.
Roi Danton

1

여기에 추가 할 것이 많지 않다고 생각할 수도 있지만 모든 버전 에서이 작업을 통합하는 방법이 필요할 수도 있습니다. 레지스트리 쿼리 접근 방식 (VS2015 이하)을 vswhere (VS2017 이상)를 사용하여 결합했습니다.

function Find-MsBuild {
    Write-Host "Using VSWhere to find msbuild..."
    $path = & $vswhere -latest -requires Microsoft.Component.MSBuild -find MSBuild\**\Bin\MSBuild.exe | select-object -first 1

    if (!$path) {
        Write-Host "No results from VSWhere, using registry key query to find msbuild (note this will find pre-VS2017 versions)..."
        $path = Resolve-Path HKLM:\SOFTWARE\Microsoft\MSBuild\ToolsVersions\* |
                    Get-ItemProperty -Name MSBuildToolsPath |
                    sort -Property @{ Expression={ [double]::Parse($_.PSChildName) }; Descending=$true } |
                    select -exp MSBuildToolsPath -First 1 |
                    Join-Path -ChildPath "msbuild.exe"
    }

    if (!$path) {
        throw "Unable to find path to msbuild.exe"
    }

    if (!(Test-Path $path)) {
        throw "Found path to msbuild as $path, but file does not exist there"
    }

    Write-Host "Using MSBuild at $path..."
    return $path
}

1

많은 정답이 있습니다. 그러나 PowerShell의 One-Liner는 최신 버전의 MSBuild 경로결정하는 데 사용합니다 .

Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\MSBuild\ToolsVersions\' | 
    Get-ItemProperty -Name MSBuildToolsPath | 
    Sort-Object PSChildName | 
    Select-Object -ExpandProperty MSBuildToolsPath -first 1

+1 정말 유용합니다! 그러나 내 대답 에는 (최신 버전을 얻는 -last 1대신) 사용 -first 1하고 파일 이름을 연결하여 폴더뿐만 아니라 전체 경로를 올바르게 가져옵니다.
Mariano Desanze

1

이 powershell 메소드는 여러 소스에서 msBuild 경로를 가져옵니다. 순서대로 시도 :

  1. 먼저 vswhere를 사용합니다 (Visual Studio에는 최신 버전의 msBuild가있는 것 같습니다).

    C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\MSBuild.exe
  2. 레지스트리 (프레임 워크 버전)를 찾지 못한 경우

    C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe

파워 쉘 코드 :

Function GetMsBuildPath {

    Function GetMsBuildPathFromVswhere {
        # Based on https://github.com/microsoft/vswhere/wiki/Find-MSBuild/62adac8eb22431fa91d94e03503d76d48a74939c
        $vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
        $path = & $vswhere -latest -prerelease -products * -requires Microsoft.Component.MSBuild -property installationPath
        if ($path) {
            $tool = join-path $path 'MSBuild\Current\Bin\MSBuild.exe'
            if (test-path $tool) {
                return $tool
            }
            $tool = join-path $path 'MSBuild\15.0\Bin\MSBuild.exe'
            if (test-path $tool) {
                return $tool
            }
        }
    }

    Function GetMsBuildPathFromRegistry {
        # Based on Martin Brandl's answer: https://stackoverflow.com/a/57214958/146513
        $msBuildDir = Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\MSBuild\ToolsVersions\' |
            Get-ItemProperty -Name MSBuildToolsPath |
            Sort-Object PSChildName |
            Select-Object -ExpandProperty MSBuildToolsPath -last 1
        $msBuildPath = join-path $msBuildDir 'msbuild.exe'
        if (test-path $msBuildPath) {
            return $msBuildPath
        }
    }

    $msBuildPath = GetMsBuildPathFromVswhere
    if (-Not $msBuildPath) {
        $msBuildPath = GetMsBuildPathFromRegistry
    }
    return $msBuildPath
}

0

정확한 버전을 모른 채 Visual Studio 2017의 경우 배치 스크립트에서 이것을 사용할 수 있습니다.

FOR /F "tokens=* USEBACKQ" %%F IN (`where /r "%PROGRAMFILES(x86)%\Microsoft Visual 
Studio\2017" msbuild.exe ^| findstr /v /i "amd64"`) DO (SET msbuildpath=%%F)

findstr 명령은 특정 msbuild 실행 파일 (이 예에서는 amd64)을 무시하는 것입니다.


0

https://github.com/linqpadless/LinqPadless/blob/master/build.cmd 에 대한 vswhere 분기를 추가 하고 내 컴퓨터에서 제대로 작동하고 vswhere 분기가 친구의 컴퓨터에서 작동합니다. vswhere 지점이 첫 번째 점검으로 진행해야 할 수 있습니다.

@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 :build

for /f "usebackq tokens=1* delims=: " %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -requires Microsoft.Component.MSBuild`) do (
  if /i "%%i"=="installationPath" set InstallDir=%%j
)

if exist "%InstallDir%\MSBuild\15.0\Bin\MSBuild.exe" (
  set "MSBUILD=%InstallDir%\MSBuild\15.0\Bin\MSBuild.exe"
)
if exist "%MSBUILD%" goto :build
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
)
echo %MSBUILD_VERSION_MAJOR% %MSBUILD_VERSION_MINOR%
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"
popd
goto :EOF

:build
setlocal
"%MSBUILD%" -restore -maxcpucount %1 /p:Configuration=%2 /v:m %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


0

최신 버전의 MsBuild를 다운로드하십시오. 다양한 프로세서 아키텍처 (Power Shell)에 대한 모든 유형의 msbuild 설치에 가장 적합한 방법 :

function Get-MsBuild-Path
{
    $msbuildPathes = $null
    $ptrSize = [System.IntPtr]::Size
    switch ($ptrSize) {
        4 {
            $msbuildPathes =
            @(Resolve-Path "${Env:ProgramFiles(x86)}\Microsoft Visual Studio\*\*\MSBuild\*\Bin\msbuild.exe" -ErrorAction SilentlyContinue) +
            @(Resolve-Path "${Env:ProgramFiles(x86)}\MSBuild\*\Bin\MSBuild.exe" -ErrorAction SilentlyContinue) +
            @(Resolve-Path "${Env:windir}\Microsoft.NET\Framework\*\MSBuild.exe" -ErrorAction SilentlyContinue)
        }
        8 {
            $msbuildPathes =
            @(Resolve-Path "${Env:ProgramFiles(x86)}\Microsoft Visual Studio\*\*\MSBuild\*\Bin\amd64\msbuild.exe" -ErrorAction SilentlyContinue) +
            @(Resolve-Path "${Env:ProgramFiles(x86)}\MSBuild\*\Bin\amd64\MSBuild.exe" -ErrorAction SilentlyContinue) +
            @(Resolve-Path "${Env:windir}\Microsoft.NET\Framework64\*\MSBuild.exe" -ErrorAction SilentlyContinue)
        }
        default {
            throw ($msgs.error_unknown_pointersize -f $ptrSize)
        }
    }

    $latestMSBuildPath = $null
    $latestVersion = $null
    foreach ($msbuildFile in $msbuildPathes)
    {
        $msbuildPath = $msbuildFile.Path
        $versionOutput = & $msbuildPath -version
        $fileVersion = (New-Object System.Version($versionOutput[$versionOutput.Length - 1]))
        if (!$latestVersion -or $latestVersion -lt $fileVersion)
        {
            $latestVersion = $fileVersion
            $latestMSBuildPath = $msbuildPath
        }
    }

    Write-Host "MSBuild version detected: $latestVersion" -Foreground Yellow
    Write-Host "MSBuild path: $latestMSBuildPath" -Foreground Yellow

    return $latestMSBuildPath;
}

-2

Delphi 프로젝트를 컴파일 하려면 msbuild + Delphi2009를 사용할 때 "오류 MSB4040 프로젝트에 대상이 없습니다"를 참조하십시오.

정답은 " rsvars.bat (RAD Studio 폴더에서 검색) 라는 배치 파일이 있습니다 . MSBuild를 호출하기 전에이 파일을 호출하면 필요한 환경 변수가 설정됩니다. rsvars에서 폴더가 올바른지 확인하십시오. .bat 컴파일러를 기본값과 다른 위치에있는 경우 "

이 bat는 PATH 환경 변수를 적절한 MSBuild.exe 버전으로 적절한 .NET 폴더로 업데이트 할뿐만 아니라 다른 필요한 변수도 등록합니다.


이 답변은 델파이와 관련이 없으며 델파이 사용자에게는 더 강력하지 않습니다.
Nashev

2
간직해서 죄송합니다. 필자는 델파이보다 더 강력하게 작동했습니다. 델파이에서는 더 쉬운 방법이있을 수 있지만 OP는 델파이에 대해 묻지 않았 으며이 스레드에는 18 가지 답변이 있습니다. 다른 사람들이 이것을 보는 것이 중요하다면, 델파이와 관련된 새로운 질문과 자기 답을 만드는 것이 좋습니다. 우리는 MSBuild에서의 모든 버전을 포함 6 개 이하의 답변을 다운 받았다면, 나는 매우 행복 할 것
jpaugh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.