Jalur ke MSBuild

187

Bagaimana saya bisa secara terprogram mendapatkan jalur ke MSBuild dari mesin tempat .exe saya berjalan?

Saya bisa mendapatkan versi .NET dari Lingkungan tetapi apakah ada cara untuk mendapatkan folder yang benar untuk versi .NET?

dagda1
sumber

Jawaban:

141

Mengaduk-aduk registri, sepertinya

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

mungkin apa yang Anda cari; jalankan regedit.exe dan lihatlah.

Kueri melalui baris perintah (per Nikolay Botev )

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

Kueri melalui PowerShell (per MovGP0 )

dir HKLM:\SOFTWARE\Microsoft\MSBuild\ToolsVersions\
Brian
sumber
5
Saya telah menginstal Visual Studio 2017 RC dan memulai Developer Command Prompt, versi MSBuild adalah 15. +, tetapi versi ini tidak ditampilkan di registri. Bagaimana cara mendapatkan akses ke MSBuild yang sama dengan yang digunakan Dev Cmd Prompt?
SuperJMN
6
MSBuild 15 terletak di `C: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Enterprise \ MSBuild \ 15.0 \ Bin \ amd64`
nZeus
2
Hanya jika Anda menginstal VS2017 di sana, saya tidak dapat menemukan satu titik masuk di registri untuk MsBuildToolsPath untuk perangkat 15.0
Paciv
8
docs.microsoft.com/en-us/visualstudio/msbuild/… "MSBuild sekarang diinstal dalam folder di bawah setiap versi Visual Studio. Misalnya, C: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Enterprise \ MSBuild "dan" Nilai ToolsVersion tidak lagi ditetapkan di registri "
Hulvej
2
@ORMapper Microsoft menawarkan proyek di GitHub untuk menentukan jalur contoh Visual Studio 2017 / msbuild 15.x. Ini adalah satu eksekusi yang dapat digunakan oleh perangkat lunak / skrip build Anda.
Roi Danton
140

Anda juga dapat mencetak jalur MSBuild.exe ke baris perintah:

reg.exe query "HKLM\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0" /v MSBuildToolsPath
Nikolay Botev
sumber
1
Harap dicatat bahwa jika Anda ingin membangun aplikasi windows phone, itu membutuhkan msbuild 32 bit. Menanyakan registri hanya memberikan msbuild 64 bit pada mesin 64 bit.
Victor Ionescu
2
@VictorIonescu: Anda dapat menggunakan /reg:32atau /reg:64pada kedua bitnessess cmd(atau proses apa pun yang Anda jalankan) untuk mendapatkan jalur itu secara eksplisit.
Simon Buchan
ini akan memberi Anda jalur ke lokasi lama (4.0) - yang mungkin Anda inginkan sebenarnya ada di tempat lain, lihat stackoverflow.com/questions/32007871/…
JonnyRaa
Dalam kasus saya itu di bawahComputer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\MSBuild\ToolsVersions\4.0\MSBuildToolsPath
Sen Jacob
32

Jika Anda ingin menggunakan MSBuild untuk .Net 4, Anda dapat menggunakan perintah PowerShell berikut untuk mendapatkan jalur yang dapat dieksekusi. Jika Anda menginginkan versi 2.0 atau 3.5 maka ubah saja variabel $ dotNetVersion.

Untuk menjalankan executable Anda harus menambahkan variabel $ msbuild dengan &. Itu akan mengeksekusi variabel.

# 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
sumber
2
bekerja juga untuk $dotNetVersion12.0 (vs 2013) dan 14.0 (vs 2015) (jika dipasang tentu saja)
Julian
4
Tidak berfungsi untuk VS 2017, yang tidak menambahkan nilai di bawah HKLM:\software\Microsoft\MSBuild\ToolsVersionskunci. Sebagai gantinya Anda perlu mendapatkan direktori instalasi VS2017 dari HKLM:\SOFTWARE\WOW6432Node\Microsoft\VisualStud‌​io\SxS\VS7\15.0, lalu tambahkan MSBuild\15.0\Bin\MSBuild.exeuntuk mendapatkan lokasi MSBuild EXE.
Ian Kemp
30

Untuk skrip shell cmd di Windows 7, saya menggunakan fragmen berikut di file batch saya untuk menemukan MSBuild.exe di .NET Framework versi 4. Saya berasumsi ada versi 4, tetapi jangan menganggap sub-versi. Ini tidak sepenuhnya untuk tujuan umum, tetapi untuk skrip cepat mungkin berguna:

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

Untuk penggunaan saya, saya keluar dari file batch dengan kesalahan jika itu tidak berhasil:

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
sumber
@yoyo Untuk apa set bb.build.msbuild.exe=? Apakah itu diperlukan atau hanya artefak dari penyiapan Anda?
Elisée
@ Elisée Ups, maaf, itu salah ketik salin / tempel. Di lingkungan saya, saya memanggil variabel bb.build.msbuild.exe, saya lalai untuk memperbaiki contoh itu ketika saya menempelkan ke jawabannya. Diperbaiki sekarang, terima kasih telah menunjukkannya.
yoyo
26

Anda dapat menggunakan Perintah PowerShell uji coba ini untuk mendapatkan MSBuildToolsPathdari registri.

PowerShell (dari registri)

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

Keluaran

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

atau dari sistem file

PowerShell (dari sistem file)

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

Keluaran

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
dhcgn.dll
sumber
1
Jawaban terbaik untuk topik ini.
Teoman shipahi
23

Petunjuk untuk menemukan 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

Petunjuk untuk menemukan 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

(Perhatikan bahwa petunjuk di atas sedikit dimodifikasi dari petunjuk resmi Microsoft. Secara khusus, saya telah menyertakan -prereleasetanda untuk memungkinkan penginstalan Pratinjau dan RC diambil, dan -products *untuk mendeteksi penginstalan Visual Studio Build Tools.)


Hanya butuh waktu lebih dari dua tahun, tetapi akhirnya pada 2019, Microsoft telah mendengarkan dan memberi kami cara untuk menemukan file executable penting ini ! Jika Anda memiliki Visual Studio 2017 dan / atau 2019 diinstal, vswhereutilitas dapat ditanyai untuk lokasi MSBuild et al. Karena vswhere selalu berada di %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe , tidak ada bootstrap dan tidak diperlukan lagi hardcoding jalur.

Keajaiban adalah -findparameternya, ditambahkan pada versi 2.6.2 . Anda dapat menentukan versi yang telah Anda instal dengan menjalankan vswhere, atau memeriksa properti filenya. Jika Anda memiliki versi yang lebih lama, Anda dapat mengunduh yang terbaru dan menimpa yang sudah ada %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe.

vswhere.exeadalah eksekusi mandiri, sehingga Anda dapat mengunduh dan menjalankannya dari mana pun Anda memiliki koneksi internet. Artinya, skrip build Anda dapat memeriksa apakah lingkungan tempat mereka berjalan telah disiapkan dengan benar, untuk menyebutkan salah satu opsi.

Ian Kemp
sumber
Sudah ada 3 jawaban yang menyebutkan vswhere, termasuk komentar Anda yang berpengaruh di bawah salah satunya. Menambahkan jawaban ini hanya akan membuat sup jawaban menjadi lebih buruk.
jpaugh
4
4 sekarang. Saya menemukan jawaban ini bermanfaat, sedangkan saya tidak menemukan jawaban lain di mana membantu.
Cowlinator
Perlu dicatat bahwa hanya karena VSWHERE mengatakan itu adalah msbuild.exe untuk digunakan, tidak berarti bahwa jika Anda mengetik msbuilddi baris perintah (terutama baris perintah Visual Studio jika menggunakan itu), itulah yang akan digunakan. Untuk melihat apa yang akan digunakan jika Anda mengetik msbuildpada baris perintah, lakukan ini: where msbuild. Jika itu tidak melaporkan sama seperti VSWHERE mengatakan yang terbaru dan terhebat, maka Anda harus melakukan jalur lengkap ke yang msbuild.exeingin Anda gunakan, atau membuat penyesuaian pada variabel PATH Anda agar sesuai.
Jinlye
Jadi pertanyaan selanjutnya adalah bagaimana Anda menemukan jalan menuju vswhere ....
BJury
@BJury Microsoft menjamin bahwa itu akan selalu di "C: \ Program Files (x86) \ Microsoft Visual Studio \ Installer \ vswhere.exe". Itulah titik awal Anda. Sebagai alternatif, seperti disebutkan dalam 2 paragraf terakhir, Anda dapat mengunduh vswhere.exedan menggunakannya secara langsung.
Ian Kemp
17

@AllenSanborn memiliki versi PowerShell yang bagus, tetapi beberapa orang memiliki persyaratan untuk hanya menggunakan skrip batch untuk build.

Ini adalah versi terapan dari apa yang dijawab @ 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

Untuk Visual Studio 2017 / MSBuild 15, Aziz Atif (orang yang menulis Elmah ) menulis skrip batch

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
JJS
sumber
2
Catatan: Karena VS2017 / msbuild 15.x tidak menggunakan registri untuk jalurnya, vswhere adalah alternatif untuk menentukan jalur msbuild.
Roi Danton
1
Juga, AzizAtif adalah laki-laki. Lihatlah ini untuk 15.1 build - github.com/linqpadless/LinqPadless/blob/master/build.cmd
JJS
2
Juga, vswhere dapat diinstal melalui Chocolatey: chocolatey.org/packages/vswhere
cowlinator
6

Ini berfungsi untuk Visual Studio 2015 dan 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

}
Raman Zhylich
sumber
3
Untuk Build Tools, gunakan vswhere -products *, seperti yang ditentukan di github.com/Microsoft/vswhere/wiki/Find-MSBuild .
TN.
Untuk vswhere Anda harus tahu jalur di mana itu berada. Dan tentu saja Anda harus memiliki power-shell yang tersedia untuk sistem build Anda. Hanya satu pertanyaan: mengapa amd64? Apakah ada sesuatu yang spesifik untuk bangunan?
Maksim
Suara positif karena solusi ini pada dasarnya hanya menggunakan kunci registri untuk MSBuild 15 juga, bukan pustaka atau skrip pihak ketiga. Karena penasaran, apa yang dimaksud dengan "SxS \ VS7"? Akankah itu tetap berlaku di semua versi VS?
Lazlo
5

Lokasi Registry

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

berikan lokasi untuk eksekusi.

Tetapi jika Anda membutuhkan lokasi tempat menyimpan ekstensi Tugas, itu aktif

%ProgramFiles%\MSBuild
Paulo Santos
sumber
4
Ini cukup tua, saya tahu - tapi bagaimanapun: di x64-Systems, MSBuild-Folder terletak di ProgramFiles (x86)
Sascha
4

mungkin cara termudah untuk membuka PowerShell dan masuk

dir HKLM:\SOFTWARE\Microsoft\MSBuild\ToolsVersions\
MovGP0
sumber
4

Satu baris berdasarkan jawaban @ dh_cgn :

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

Ini memilih semua jalur yang ada misalnya. C:\Program Files (x86)\Microsoft Visual Studio\*\*\MSBuild\*\bin\msbuild.exe.

Bintang wildcard adalah:

  • tahun (2017)
  • edisi studio visual (komunitas, profesional, perusahaan)
  • versi alat (15.0)

Ketahuilah bahwa perintah ini memilih jalur pertama yang cocok dengan ekspresi yang diurutkan berdasarkan alfabet. Untuk mempersempitnya, ganti saja wildcard dengan elemen tertentu misalnya. tahun atau versi alat.

Serius
sumber
3

Di Windows 2003 dan yang lebih baru, ketik perintah ini di cmd:

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

Jika tidak ada yang muncul, itu berarti bahwa kerangka .NET tidak termasuk dalam PATH sistem. MSBuild harus ada di folder instalasi .NET, bersama dengan kompiler .NET (vbc.exe, csc.exe)

draganicimw
sumber
Jawaban ini tidak menambah banyak jawaban lain. Ini kurang kuat dari jawaban ini
jpaugh
3

Dimulai dengan MSBuild 2017 (v15), MSBuild sekarang diinstal di folder di bawah setiap versi Visual Studio

Berikut beberapa contoh tempat MSBuild.exe ditemukan di komputer saya:

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)
cowlinator
sumber
Menurut sebuah jawaban sebelumnya , 2017 memang sebenarnya menyimpan informasi ini dalam registri.
jpaugh
2

Untuk mengambil lintasan msbuild 15 (Visual Studio 2017) dengan batch dari registri tanpa alat tambahan:

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

Alat yang tersedia lebih baik:

Roi Danton
sumber
1
Anda menyelamatkan hidup saya
Hakan Fıstık
Sudah ada versi PowerShell ini. Sekitar tahun 2017, apakah ada alasan untuk menghindari mempelajari Powershell?
jpaugh
2
@jpaugh Tidak semua sistem build memiliki PowerShell.
Roi Danton
1

Anda tidak akan berpikir ada banyak hal untuk ditambahkan di sini, tetapi mungkin inilah waktunya untuk cara terpadu melakukan ini di semua versi. Saya telah menggabungkan pendekatan kueri-registri (VS2015 dan di bawahnya) dengan penggunaan vswhere (VS2017 dan yang lebih baru) untuk menghasilkan ini:

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
}
Neil Barnwell
sumber
1

Ada banyak jawaban yang benar. Namun, di sini One-Liner di PowerShell yang saya gunakan untuk menentukan jalur MSBuild untuk versi terbaru :

Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\MSBuild\ToolsVersions\' | 
    Get-ItemProperty -Name MSBuildToolsPath | 
    Sort-Object PSChildName | 
    Select-Object -ExpandProperty MSBuildToolsPath -first 1
Martin Brandl
sumber
+1 Sangat berguna! Tetapi dalam jawaban saya, saya menggunakan -last 1(bukan -first 1untuk mendapatkan versi terbaru) dan juga menggabungkan nama file (untuk mendapatkan path lengkap dengan benar dan tidak hanya foldernya).
Mariano Desanze
1

Metode PowerShell ini mendapatkan jalur ke msBuild dari berbagai sumber. Mencoba secara berurutan:

  1. Pertama menggunakan vswhere (karena Visual Studio tampaknya memiliki versi msBuild yang lebih mutakhir) misalnya

    C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\MSBuild.exe
    
  2. Jika tidak ditemukan mencoba registri (versi kerangka kerja) mis

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

Kode 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
}
Mariano Desanze
sumber
0

Untuk Visual Studio 2017 tanpa mengetahui edisi yang tepat, Anda dapat menggunakan ini dalam skrip batch:

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

Perintah findstr adalah untuk mengabaikan executable msbuild tertentu (dalam contoh ini amd64).

Ernstjan Freriks
sumber
0

tambahkan cabang vswhere untuk https://github.com/linqpadless/LinqPadless/blob/master/build.cmd , berfungsi dengan baik di komputer saya, dan cabang vswhere berfungsi di komputer teman saya. Mungkin, cabang vswhere harus bergerak maju sebagai cek pertama.

@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
Shamork.Fu
sumber
0

Dapatkan versi terbaru MsBuild. Cara terbaik, untuk semua jenis instalasi msbuild, untuk arsitektur prosesor yang berbeda (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;
}
Stas BZ
sumber
-2

Jika Anda ingin mengkompilasi proyek Delphi, lihat "ERROR MSB4040 Tidak ada target dalam proyek" saat menggunakan msbuild + Delphi2009

Jawaban yang benar ada yang berkata: "Ada file batch bernama rsvars.bat (cari di folder RAD Studio). Panggil itu sebelum memanggil MSBuild, dan itu akan mengatur variabel lingkungan yang diperlukan. Pastikan folder sudah benar di rsvars .bat jika Anda memiliki kompilator di lokasi yang berbeda dengan default. "

Kelelawar ini tidak hanya akan memperbarui variabel lingkungan PATH ke folder .NET yang tepat dengan versi MSBuild.exe yang tepat, tetapi juga mendaftarkan variabel lain yang diperlukan.

Nashev
sumber
Jawaban itu tidak berhubungan dengan Delphi dan tidak lebih kuat untuk pengguna Delphi.
Nashev
2
Maaf sudah singkat. Maksud saya lebih kuat seperti di, bekerja untuk lebih dari sekadar Delphi. Mungkin ada cara yang lebih mudah untuk melakukannya di Delphi, tetapi OP tidak menanyakan tentang Delphi, dan utas ini memiliki 18 jawaban yang hanya akan sedikit dilihat. Jika penting bagi Anda bahwa orang lain melihat ini, saya sarankan Anda membuat pertanyaan baru khusus untuk Delphi, dan jawab sendiri. Jika kami mendapatkan 6 jawaban atau kurang yang mencakup setiap versi MSBuild, saya akan sangat senang
jpaugh