MSBuild yolu


186

Programımın .exe çalıştığı bir makineden MSBuild yolunu nasıl alabilirim?

.NET sürümünü Ortam'dan alabilirim, ancak .NET sürümü için doğru klasörü almanın bir yolu var mı?

Yanıtlar:


141

Kayıt defterini araştırmak gibi görünüyor

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

peşinde olduğunuz şey olabilir; regedit.exe'yi ateşleyin ve bir göz atın.

Komut satırı üzerinden sorgulama ( Nikolay Botev başına )

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

PowerShell ile sorgulama ( MovGP0 başına )

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

5
Visual Studio 2017 RC'yi yükledim ve Geliştirici Komut İstemi'ni başlattım, MSBuild sürümü 15. +, ancak bu sürüm kayıt defterinde gösterilmiyor. Dev Cmd İsteminin kullandığı MSBuild'e nasıl erişebilirim?
SuperJMN

6
MSBuild 15, `C: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Enterprise \ MSBuild \ 15.0 \ Bin \ amd64`
nZeus

2
Sadece VS2017'yi oraya yüklediyseniz, 15.0 araç seti için MsBuildToolsPath için kayıt defterinde tek bir giriş noktası bulamadım
Paciv

8
docs.microsoft.com/tr-tr/visualstudio/msbuild/… "MSBuild artık Visual Studio'nun her sürümü altındaki bir klasöre yüklenmiştir. Örneğin, C: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Enterprise \ MSBuild "ve" ToolsVersion değerleri artık kayıt defterinde ayarlanmadı "
Hulvej

2
@ ORMapper Microsoft, Visual Studio 2017 / msbuild 15.x örneklerinin yollarını belirlemek için GitHub'da bir proje sunar . Yapı yazılımınız / komut dosyalarınız tarafından kullanılabilen tek bir yürütülebilir dosyadır.
Roi Danton

140

Ayrıca MSBuild.exe dosyasının komut satırına da yazdırabilirsiniz:

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

1
Bir windows phone uygulaması oluşturmak istiyorsanız, bunun 32 bit msbuild'e ihtiyacı olduğunu lütfen unutmayın. Kayıt defterini sorgulamak, 64 bit makinede yalnızca 64 bit msbuild'i verir.
Victor Ionescu

2
@VictorIonescu: Sen kullanabilirsiniz /reg:32veya /reg:64her ikisi bitnessess üzerine cmd(ya da her türlü Çalıştırdığınız işlemek) açıkça bu yolu alır.
Simon Buchan

bu size eski (4.0) bir konumun yolunu verecektir - muhtemelen istediğiniz başka bir yer aslında bkz. stackoverflow.com/questions/32007871/…
JonnyRaa

Benim durumum altındaydıComputer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\MSBuild\ToolsVersions\4.0\MSBuildToolsPath
Sen Jacob

32

Net 4 için MSBuild kullanmak istiyorsanız, yürütülebilir yolunu almak için aşağıdaki PowerShell komutunu kullanabilirsiniz. Sürüm 2.0 veya 3.5 istiyorsanız, $ dotNetVersion değişkenini değiştirmeniz yeterlidir.

Yürütülebilir dosyayı çalıştırmak için $ msbuild değişkeninin başına & eklemeniz gerekir. Bu değişkeni yürütür.

# 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
için de çalışır $dotNetVersion(elbette yüklüyse) (2015 vs) (2013 vs) 12.0 ve 14.0
Julian

4
HKLM:\software\Microsoft\MSBuild\ToolsVersionsAnahtarın altına bir değer eklemeyen VS 2017 için çalışmaz . Bunun yerine, VS2017 install dir dosyasını almanız ve HKLM:\SOFTWARE\WOW6432Node\Microsoft\VisualStud‌​io\SxS\VS7\15.0ardından MSBuild\15.0\Bin\MSBuild.exeMSBuild EXE konumunu almak için eklemeniz gerekir.
Ian Kemp

30

Windows 7'de cmd kabuk komut dosyası oluşturma için, .NET Framework sürüm 4'te MSBuild.exe dosyasını bulmak için toplu iş dosyamda aşağıdaki parçayı kullanıyorum. Bu tamamen genel amaçlı değildir, ancak hızlı komut dosyaları için yardımcı olabilir:

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

Kullanımlarım için işe yaramazsa toplu iş dosyasından bir hata ile çıkıyorum:

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 Ne set bb.build.msbuild.exe=için? Gerekli mi yoksa sadece kurulumunuzun bir eseri mi?
Elisée

@ Elisée Hata! Üzgünüm, bu bir kopyala / yapıştır yazım hatası. Benim çevremde bb.build.msbuild.exe değişkenini çağırıyorum, cevaba yapıştırdığımda bu örneği düzeltmeyi ihmal ettim. Şimdi düzeltildi, işaret ettiğiniz için teşekkürler.
yoyo

26

MSBuildToolsPathKayıt defterinden almak için bu çok deneme PowerShell Komutunu kullanabilirsiniz .

PowerShell (kayıt defterinden)

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

Çıktı

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

veya dosya sisteminden

PowerShell (dosya sisteminden)

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

Çıktı

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
Bu konuda en iyi cevap.
Teoman shipahi

21

MSBuild bulma talimatları :

  • Güç kalkanı: &"${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'i bulmak için talimatlar :

  • Güç kalkanı: &"${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

(Yukarıdaki talimatların Microsoft'un resmi talimatlarından biraz değiştirildiğini unutmayın. Özellikle, -prereleaseÖnizleme ve RC kurulumlarının alınmasına izin vermek ve -products *Visual Studio Derleme Araçları kurulumlarını tespit etmek için bayrağı ekledim .)


Sadece iki yıl sürdü, ancak nihayet 2019'da Microsoft bu hayati yürütülebilirleri bulmamız için bizi dinledi ve verdi ! Visual Studio 2017 ve / veya 2019 yüklüyse, vswhereyardımcı program MSBuild ve ark. Yana vswhere hep bulunur %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe , hiçbir ön yükleme ve artık gerekli hiçbir yol hardcoding yoktur.

Sihir 2.6.2 sürümünde eklenen-find parametredir . Yüklediğiniz sürümü çalıştırarak veya dosya özelliklerini kontrol ederek belirleyebilirsiniz. Eski bir sürümünüz varsa, en son sürümü indirebilir ve mevcut sürümün üzerine yazabilirsiniz .vswhere%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe

vswhere.exebağımsız bir yürütülebilir dosyadır, böylece internet bağlantınız olan herhangi bir yerden indirip çalıştırabilirsiniz. Bu, derleme komut dosyalarınızın üzerinde çalıştıkları ortamın doğru bir şekilde ayarlanıp ayarlanmadığını bir seçeneği belirtmek için kontrol edebileceği anlamına gelir.


Bunlardan birinin altında bu etkiye yorumunuz da dahil olmak üzere, vswhere bahseden 3 cevap zaten var. Bu cevabı eklemek cevap çorbasını daha da kötüleştirir.
jpaugh

4
4 şimdi. Bu yanıtı yararlı buldum, diğer vswhere cevaplarını yararlı bulamadım.
cowlinator

Sadece VSWHERE kullanmak için msbuild.exe olduğunu söyledi çünkü msbuild, komut satırına (özellikle kullanıyorsanız Visual Studio komut satırı) yazarsanız, bu kullanılacak olan anlamına gelmez . Yazarsanız kullanılan alır görmek için msbuildkomut satırına Bunu yapmak: where msbuild. Bu, VSWHERE'nin en son ve en büyüğü olduğunu söylediği gibi rapor etmiyorsa, msbuild.exekullanmak istediğiniz yolun tam yolunu yapmanız veya PATH değişkenlerinizde ayarlamalar yapmanız gerekir.
Jinlye

Bir sonraki soru vswhere yolunu nasıl bulacağınız ...
BJury

17

@AllenSanborn'un harika bir powershell sürümü var, ancak bazı kişilerin derlemeler için yalnızca toplu komut dosyaları kullanma gereksinimi vardır.

Bu, @ bono8106'nın yanıtladığı uygulamanın uygulanan bir sürümüdür.

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 için Aziz Atif ( Elmah yazan adam ) bir toplu senaryo yazdı

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
Not: VS2017 / msbuild 15.x, kayıt defterini yolları için kullanmadığından vswhere , msbuild yolunu belirlemek için bir alternatiftir.
Roi Danton

1
Ayrıca, AzizAtif adamdır. 15.1 sürümler için bir göz atın - github.com/linqpadless/LinqPadless/blob/master/build.cmd
JJS

2
Ayrıca, vswhere Chocolatey aracılığıyla kurulabilir: chocolatey.org/packages/vswhere
cowlinator

6

Bu, Visual Studio 2015 ve 2017 için çalışır:

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
Derleme Araçları vswhere -products *için github.com/Microsoft/vswhere/wiki/Find-MSBuild'de belirtildiği şekilde kullanın .
TN.

Vswhere için bulunduğu yolu bilmeniz gerekir. Ve tabii ki yapı sisteminiz için güç kabuğuna sahip olmalısınız. Sadece bir soru: neden amd64? Binaya özgü bir şey var mı?
Maxim

Bu çözüm, aslında üçüncü taraf bir kütüphane veya komut dosyası değil, MSBuild 15 için de bir kayıt defteri anahtarı kullandığı için seçildi. Meraktan, "SxS \ VS7" ne anlama geliyor? Bu VS sürümlerinde geçerli olacak mı?
Lazlo

5

Kayıt defteri konumları

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

yürütülebilir dosyanın konumunu belirtin.

Ancak Görev uzantılarını kaydedeceğiniz konuma ihtiyacınız varsa,

%ProgramFiles%\MSBuild

4
Oldukça eski, biliyorum - ama yine de: x64-Systems üzerinde, MSBuild-Folder ProgramFiles (x86)
Sascha

4

En kolay yol PowerShell'i açmak ve girmek olabilir

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

4

@ Dh_cgn'ın cevabına dayanan bir astar :

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

Örneğin, varolan tüm yol yollarını seçer. C:\Program Files (x86)\Microsoft Visual Studio\*\*\MSBuild\*\bin\msbuild.exe.

Joker yıldızlar:

  • yıl (2017)
  • visual studio edition (topluluk, profesyonel, kurumsal)
  • araçlar sürümü (15.0)

Bu komutun, alfabeye göre sıralanmış ifadeyle eşleşen ilk yolu seçtiğini unutmayın. Bunu daraltmak için joker karakterleri belirli öğelerle değiştirin. yıl veya araçlar sürümü.


3

Windows 2003 ve sonraki sürümlerde cmd olarak bu komutu yazın:

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

Hiçbir şey görüntülenmezse, .NET çerçevesinin sistem PATH'sine dahil olmadığı anlamına gelir. MSBuild .NET derleyicileriyle birlikte .NET yükleme klasöründe olmalıdır (vbc.exe, csc.exe)


Bu cevap diğer cevaplara fazla bir şey katmıyor. Bu cevaptan
jpaugh

3

MSBuild 2017 (v15) ile başlayarak, MSBuild artık Visual Studio'nun her sürümünün altındaki bir klasöre yüklenir

Makinemde MSBuild.exe'nin nerede bulunduğuna dair bazı örnekler:

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)

Bir göre önceki cevabı 2017 does gerçeği deposunda kayıt defterinde bu bilgileri.
jpaugh

2

Ek araçlar olmadan kayıt defterinden toplu olarak msbuild 15 (Visual Studio 2017) yolunu almak için :

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

Daha iyi kullanılabilir araçlar:


1
hayatımı kurtardın
Hakan Fıstık

Bunun bir PowerShell sürümü zaten var . 2017 dolaylarında, Powershell öğrenmekten kaçınmak için herhangi bir neden var mı?
jpaugh

2
@jpaugh Her derleme sisteminde PowerShell yoktur.
Roi Danton

1

Buraya eklenecek çok şey olduğunu düşünmezsiniz, ancak belki de tüm sürümlerde bunu yapmanın birleşik bir yolunun zamanı gelmiştir. Kayıt defteri-sorgu yaklaşımını (VS2015 ve altı) vswhere (VS2017 ve üstü) kullanımı ile birlikte bu ile geldim:

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

Birçok doğru cevap var. Ancak, burada en son sürüm için MSBuild yolunu belirlemek için kullandığım PowerShell One-Liner :

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

+1 Gerçekten faydalı! Ama cevabımda -last 1( -first 1en son sürümü almak için) kullanıyorum ve dosya adını da birleştiriyorum (sadece klasörü değil, tam yolu düzgün bir şekilde almak için).
Mariano Desanze

1

Bu powershell yöntemi, birden çok kaynaktan msBuild yolunu alır. Sırayla deniyorum:

  1. İlk olarak vswhere'i kullanma (çünkü Visual Studio'nun msBuild'in daha güncel sürümleri var gibi görünüyor) örn.

    C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\MSBuild.exe
  2. Kayıt defterini denerken bulunamadı (çerçeve sürümü) örn.

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

Powershell kodu:

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

Tam sürümü bilmeden Visual Studio 2017 için bunu bir toplu iş komut dosyasında kullanabilirsiniz:

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 komutu, belirli msbuild yürütülebilir dosyalarını (bu örnekte amd64) yok saymaktır.


0

https://github.com/linqpadless/LinqPadless/blob/master/build.cmd için vswhere şubesi ekle , bilgisayarımda iyi çalışıyor ve arkadaşımın bilgisayarında vswhere dalı çalışıyor. Belki, vswhere şubesi ilk kontrol olarak ilerlemelidir.

@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'in son sürümünü edinin. Farklı işlemci mimarisi (Power Shell) için tüm msbuild kurulumları için en iyi yol:

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

Bir Delphi projesi derlemek istiyorsanız, msbuild + Delphi2009 kullanırken "HATA MSB4040 Projede hedef yok" konusuna bakın.

Doğru cevap var: " rsvars.bat adlı bir toplu iş dosyası var (RAD Studio klasöründe arayın). MSBuild çağırmadan önce arayın ve gerekli ortam değişkenlerini ayarlayacaktır. Rsvars klasörlerin doğru olduğundan emin olun .bat derleyicisini varsayılandan farklı bir konumda varsa. "

Bu yarasa, PATH ortam değişkenini yalnızca uygun MSBuild.exe sürümüyle uygun .NET klasörüne güncellemekle kalmaz, aynı zamanda diğer gerekli değişkenleri de kaydeder.


Bu cevap Delphi ile ilgili değildir ve Delphi kullanıcıları için daha sağlam değildir.
Nashev

2
Kısa olduğu için özür dilerim. Daha güçlü demek istedim, sadece Delphi için değil. Delphi'de yapmanın daha kolay bir yolu olabilir, ancak OP Delphi hakkında sormadı ve bu iş parçacığının birkaç tanesinin göreceği 18 cevabı var. Başkalarının bunu görmesi sizin için önemliyse, Delphi'ye özgü yeni bir soru oluşturmanızı ve kendi kendinize cevap vermenizi tavsiye ederim.
MSBuild'in
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.