Đường dẫn đến MSBuild


186

Làm cách nào để lập trình đường dẫn đến MSBuild từ máy .exe của tôi đang chạy?

Tôi có thể lấy phiên bản .NET từ Môi trường nhưng có cách nào để lấy đúng thư mục cho phiên bản .NET không?

Câu trả lời:


141

Chọc vào sổ đăng ký, có vẻ như

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

có thể là những gì bạn đang theo đuổi; kích hoạt regedit.exe và có một cái nhìn.

Truy vấn thông qua dòng lệnh (theo Nikolay Botev )

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

Truy vấn qua PowerShell (mỗi MovGP0 )

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

5
Tôi đã cài đặt Visual Studio 2017 RC và bắt đầu Dấu nhắc lệnh dành cho nhà phát triển, phiên bản MSBuild là 15. +, nhưng phiên bản này không hiển thị trong sổ đăng ký. Làm cách nào để tôi có quyền truy cập vào cùng một MSBuild mà Dev Cmd Prompt đang sử dụng?
SuperJMN

6
MSBuild 15 được đặt tại `C: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Enterprise \ MSBuild \ 15.0 \ Bin \ amd64`
nZeus

2
Chỉ khi bạn cài đặt VS2017 ở đó, tôi không thể tìm thấy một điểm nhập duy nhất trong sổ đăng ký cho MsBuildToolsPath cho bộ công cụ 15.0
Paciv

8
docs.microsoft.com/en-us/visualstudio/msbuild/ trộm "MSBuild hiện được cài đặt trong một thư mục dưới mỗi phiên bản của Visual Studio. Ví dụ: C: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Enterprise \ Các giá trị MSBuild "và" ToolsVersion không còn được đặt trong sổ đăng ký "
Hulvej

2
@ORMapper Microsoft cung cấp một dự án trên GitHub để xác định con đường của Visual Studio 2017 / msbuild 15.x trường. Nó là một tệp thực thi duy nhất có thể được sử dụng bởi phần mềm / tập lệnh xây dựng của bạn.
Roi Danton

140

Bạn cũng có thể in đường dẫn của MSBuild.exe đến dòng lệnh:

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

1
Xin lưu ý rằng nếu bạn muốn xây dựng một ứng dụng Windows phone, cần msbuild 32 bit. Truy vấn sổ đăng ký chỉ cung cấp msbuild 64 bit trên máy 64 bit.
Victor Ionescu

2
@VictorIonescu: Bạn có thể sử dụng /reg:32hoặc /reg:64trên cả hai bitnessess cmd(hoặc bất kỳ quy trình nào bạn đang chạy) để có được đường dẫn đó một cách rõ ràng.
Simon Buchan

điều này sẽ cung cấp cho bạn đường dẫn đến một vị trí (4.0) cũ - địa điểm mà bạn có thể muốn thực sự ở nơi khác xem stackoverflow.com/questions/32007871/
Kẻ

Trong trường hợp của tôi, nó nằm dướiComputer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\MSBuild\ToolsVersions\4.0\MSBuildToolsPath
Sen Jacob

32

Nếu bạn muốn sử dụng MSBuild cho .Net 4 thì bạn có thể sử dụng lệnh PowerShell sau để nhận đường dẫn thực thi. Nếu bạn muốn phiên bản 2.0 hoặc 3.5 thì chỉ cần thay đổi biến $ dotNetVersion.

Để chạy tệp thực thi, bạn cần thêm vào biến $ msbuild với &. Điều đó sẽ thực hiện các biến.

# 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
cũng hoạt động cho $dotNetVersion12.0 (so với 2013) và 14.0 (so với 2015) (nếu được cài đặt tất nhiên)
Julian

4
Không hoạt động cho VS 2017, không thêm giá trị dưới HKLM:\software\Microsoft\MSBuild\ToolsVersionskhóa. Thay vào đó, bạn cần lấy thư mục cài đặt VS2017 từ HKLM:\SOFTWARE\WOW6432Node\Microsoft\VisualStud‌​io\SxS\VS7\15.0đó, sau đó nối thêm MSBuild\15.0\Bin\MSBuild.exeđể lấy vị trí MSBuild EXE.
Ian Kemp

30

Đối với tập lệnh shell cmd trong Windows 7, tôi sử dụng đoạn sau trong tệp bó của mình để tìm MSBuild.exe trong phiên bản .NET Framework 4. Tôi giả sử phiên bản 4 có mặt, nhưng không giả sử phiên bản phụ. Đây không hoàn toàn là mục đích chung, nhưng đối với các kịch bản nhanh, nó có thể hữu ích:

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

Đối với mục đích sử dụng của tôi, tôi đang thoát khỏi tệp bó có lỗi nếu điều đó không hoạt động:

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=để làm gì? Nó được yêu cầu hay chỉ là một tạo tác của thiết lập của bạn?
Elisée

@ Elisée Rất tiếc, đó là lỗi sao chép / dán. Trong môi trường của tôi, tôi gọi biến bb.build.msbuild.exe, tôi đã bỏ qua việc sửa trường hợp đó khi tôi dán vào câu trả lời. Đã sửa bây giờ, cảm ơn vì đã chỉ ra điều đó.
yoyo

26

Bạn có thể sử dụng Lệnh PowerShell rất dùng thử này để lấy MSBuildToolsPathtừ sổ đăng ký.

PowerShell (từ sổ đăng ký)

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

Đầu ra

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

hoặc từ hệ thống tập tin

PowerShell (từ hệ thống tệp)

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

Đầu ra

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
Câu trả lời tốt nhất về chủ đề này.
Teoman shipahi

19

Hướng dẫn tìm 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

Hướng dẫn tìm 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

(Lưu ý rằng các hướng dẫn ở trên được sửa đổi một chút so với hướng dẫn chính thức của Microsoft. Đặc biệt, tôi đã bao gồm -prereleasecờ để cho phép cài đặt Bản xem trước và RC được chọn và -products *để phát hiện các bản cài đặt Visual Studio Build Tools.)


Chỉ mất hơn hai năm nhưng cuối cùng vào năm 2019, Microsoft đã lắng nghe và cho chúng tôi một cách để tìm ra những thực thi quan trọng này ! Nếu bạn đã cài đặt Visual Studio 2017 và / hoặc 2019, vswheretiện ích có thể được truy vấn cho vị trí của MSBuild et al. Vì vswhere luôn luôn nằm ở %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe đó, không có bootstrapping và không cần mã hóa đường dẫn nữa.

Phép thuật là -findtham số, được thêm vào trong phiên bản 2.6.2 . Bạn có thể xác định phiên bản bạn đã cài đặt bằng cách chạy vswherehoặc kiểm tra thuộc tính tệp của nó. Nếu bạn có phiên bản cũ hơn, bạn chỉ cần tải xuống phiên bản mới nhất và ghi đè lên phiên bản hiện có %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe.

vswhere.exelà một tệp thực thi độc lập, vì vậy bạn có thể tải xuống và chạy nó từ bất cứ nơi nào bạn có kết nối internet. Điều đó có nghĩa là tập lệnh xây dựng của bạn có thể kiểm tra xem môi trường họ đang chạy có được thiết lập chính xác hay không, để đặt tên cho một tùy chọn.


Đã có 3 câu trả lời đề cập đến vswhere, bao gồm cả nhận xét của bạn về hiệu ứng đó theo một trong số đó. Thêm câu trả lời này chỉ làm cho câu trả lời súp tồi tệ hơn.
jpaugh

4
4 giờ. Tôi thấy câu trả lời này hữu ích, trong khi tôi không tìm thấy câu trả lời khác của vswhere hữu ích.
chăn bò

Đáng lưu ý rằng chỉ vì VSWHERE nói rằng đó là msbuild.exe để sử dụng, điều đó không có nghĩa là nếu bạn gõ msbuildvào dòng lệnh (đặc biệt là dòng lệnh Visual Studio nếu sử dụng nó), thì đó sẽ là cái sẽ được sử dụng. Để xem những gì được sử dụng nếu bạn gõ msbuildvào dòng lệnh, hãy làm điều này : where msbuild. Nếu điều đó không báo cáo giống như VSWHERE nói mới nhất và lớn nhất là, thì bạn phải thực hiện một đường dẫn đầy đủ đến msbuild.exebạn muốn sử dụng hoặc điều chỉnh các biến PATH cho phù hợp.
Jinlye

Vì vậy, câu hỏi tiếp theo là làm thế nào để bạn tìm thấy đường dẫn đến vswhere ....
BJury

17

@ ALLenSanborn có một phiên bản powershell tuyệt vời, nhưng một số người có yêu cầu chỉ sử dụng các tập lệnh bó cho các bản dựng.

Đây là phiên bản áp dụng của những gì @ bono8106 đã trả lời.

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

xây dựng

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

Đối với Visual Studio 2017 / MSBuild 15, Aziz Atif (anh chàng đã viết Elmah ) đã viết một kịch bản hàng loạt

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
Lưu ý: Vì VS2017 / msbuild 15.x không sử dụng sổ đăng ký cho đường dẫn của họ, vswhere là một cách thay thế để xác định đường dẫn msbuild.
Roi Danton

1
Ngoài ra, AzizAtif là người đàn ông. Hãy tận hưởng điều này trong các bản dựng 15.1 - github.com/linqpadless/LinqPadless/blob/master/build.cmd
JJS

2
Ngoài ra, vswhere có thể được cài đặt qua Chocolatey: chocolatey.org/packages/vswhere
cowlinator

6

Điều này hoạt động cho Visual Studio 2015 và 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
Đối với Công cụ xây dựng, hãy sử dụng vswhere -products *, như được chỉ định trong github.com/Microsoft/vswhere/wiki/Find-MSBuild .
TN.

Đối với vswhere bạn nên biết con đường nơi nó nằm. Và tất nhiên bạn nên có sẵn vỏ điện cho hệ thống xây dựng của mình. Chỉ một câu hỏi: tại sao amd64? Nó có bất cứ điều gì cụ thể để xây dựng?
Maxim

Được nâng cấp bởi vì giải pháp này về cơ bản chỉ sử dụng khóa đăng ký cho MSBuild 15 chứ không phải thư viện hoặc tập lệnh của bên thứ ba. Vì tò mò, "SxS \ VS7" đề cập đến điều gì? Điều đó sẽ còn hiệu lực trên các phiên bản VS?
Lazlo

5

Các vị trí đăng ký

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

đưa ra vị trí cho việc thực thi.

Nhưng nếu bạn cần vị trí lưu các tiện ích mở rộng Nhiệm vụ, thì nó sẽ bật

%ProgramFiles%\MSBuild

4
Nó khá cũ, tôi biết - nhưng dù sao: trên x64-Systems, Thư mục MSBuild được đặt trong ProgramFiles (x86)
Sascha

4

Cách dễ nhất có thể là mở PowerShell và nhập

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

4

Một lớp lót dựa trên câu trả lời của @ dh_cgn :

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

Nó chọn tất cả các đường dẫn đường dẫn hiện có của vd. C:\Program Files (x86)\Microsoft Visual Studio\*\*\MSBuild\*\bin\msbuild.exe.

Các ngôi sao ký tự đại diện là:

  • năm (2017)
  • phiên bản studio hình ảnh (cộng đồng, chuyên nghiệp, doanh nghiệp)
  • phiên bản công cụ (15.0)

Xin lưu ý rằng lệnh này đang chọn đường dẫn đầu tiên khớp với biểu thức được sắp xếp theo bảng chữ cái. Để thu hẹp nó, chỉ cần thay thế các ký tự đại diện bằng các yếu tố cụ thể, ví dụ. năm hoặc phiên bản công cụ.


3

Trên Windows 2003 trở lên, gõ lệnh này trong cmd:

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

Nếu không có gì xuất hiện, điều đó có nghĩa là .NET framework không được bao gồm trong PATH của hệ thống. MSBuild phải nằm trong thư mục cài đặt .NET, cùng với trình biên dịch .NET (vbc.exe, csc.exe)


Câu trả lời này không thêm nhiều hơn các câu trả lời khác. Nó kém mạnh mẽ hơn câu trả lời này
jpaugh 15/11/18

3

Bắt đầu với MSBuild 2017 (v15), MSBuild hiện được cài đặt trong một thư mục theo từng phiên bản của Visual Studio

Dưới đây là một số ví dụ về nơi MSBuild.exe được tìm thấy trên máy của tôi:

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)

Theo một câu trả lời trước , năm 2017 thực hiện tại cửa hàng thực tế thông tin này trong registry.
jpaugh

2

Để lấy đường dẫn của msbuild 15 (Visual Studio 2017) với lô từ sổ đăng ký với các công cụ bổ sung:

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

Công cụ có sẵn tốt hơn:


1
bạn đã cứu mạng tôi
Hakan Fıstık

Đã có phiên bản PowerShell này. Circa 2017, có lý do nào để tránh học Powershell không?
jpaugh

2
@jpaugh Không phải mọi hệ thống xây dựng đều có sẵn PowerShell.
Roi Danton

1

Bạn sẽ không nghĩ rằng có nhiều thứ để thêm vào đây, nhưng có lẽ đã đến lúc cần một cách thống nhất để thực hiện điều này trên tất cả các phiên bản. Tôi đã kết hợp phương pháp truy vấn đăng ký (VS2015 trở xuống) với việc sử dụng vswhere (VS2017 trở lên) để đưa ra cách này:

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

Có nhiều câu trả lời đúng. Tuy nhiên, ở đây một One-liner trong PowerShell tôi sử dụng để xác định đường dẫn MSBuild cho phiên bản mới nhất :

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

+1 Thực sự hữu ích! Nhưng trong câu trả lời của tôi, tôi sử dụng -last 1(thay vì -first 1để có được phiên bản mới nhất) và cũng ghép tên tệp (để có được đường dẫn đầy đủ và không chỉ thư mục).
Mariano Desanze

1

Phương thức powershell này có đường dẫn đến msBuild từ nhiều nguồn. Cố gắng theo thứ tự:

  1. Lần đầu tiên sử dụng vswhere (vì Visual Studio dường như có các phiên bản cập nhật hơn của msBuild), vd

    C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\MSBuild.exe
  2. Nếu không tìm thấy hãy thử đăng ký (phiên bản khung), vd

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

Mã số Powershell:

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

Đối với Visual Studio 2017 mà không biết phiên bản chính xác, bạn có thể sử dụng phiên bản này trong tập lệnh bó:

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

Lệnh findstr là bỏ qua các tệp thực thi msbuild nhất định (trong ví dụ này là amd64).


0

thêm chi nhánh vswhere cho https://github.com/linqpadless/LinqPadless/blob/master/build.cmd , hoạt động tốt trong máy tính của tôi và chi nhánh vswhere hoạt động trên máy tính của người bạn đời của tôi. Có thể, chi nhánh vswhere nên di chuyển về phía trước như là kiểm tra đầu tiên.

@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

Nhận phiên bản mới nhất của MsBuild. Cách tốt nhất, cho tất cả các loại cài đặt msbuild, cho kiến ​​trúc bộ xử lý khác nhau (Power Shell):

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

Nếu bạn muốn biên dịch một dự án Delphi, hãy xem "ERROR MSB4040 Không có mục tiêu nào trong dự án" khi sử dụng msbuild + Delphi2009

Câu trả lời đúng có nói: "Có một tệp bó gọi là rsvars.bat (tìm kiếm nó trong thư mục RAD Studio). Gọi đó trước khi gọi MSBuild, và nó sẽ thiết lập các biến môi trường cần thiết. Hãy chắc chắn rằng các thư mục là chính xác trong rsvars .bat nếu bạn có trình biên dịch ở một vị trí khác với mặc định. "

Con dơi này sẽ không chỉ cập nhật biến môi trường PATH thành thư mục .NET thích hợp với phiên bản MSBuild.exe thích hợp, mà còn đăng ký các biến cần thiết khác.


Câu trả lời đó không liên quan đến Delphi và không mạnh mẽ hơn cho người dùng Delphi.
Nashev

2
Xin lỗi vì đã ngắn gọn. Tôi có nghĩa là mạnh mẽ hơn như trong, làm việc cho nhiều hơn là chỉ Delphi. Có thể có một cách dễ dàng hơn để làm điều đó trong Delphi, nhưng OP đã không hỏi về Delphi và chủ đề này có khoảng 18 câu trả lời mà ít ai từng thấy. Nếu điều quan trọng với bạn là người khác thấy điều này, tôi khuyên bạn nên tạo một câu hỏi mới cụ thể cho Delphi và tự trả lời. Nếu chúng tôi có tới 6 câu trả lời hoặc ít hơn bao gồm mọi phiên bản MSBuild, tôi sẽ rất vui
jpaugh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.