Cale de acces la MSBuild (Programare, .Net, Msbuild)

dagda1 a intrebat.

Cum pot obține în mod programatic calea către MSBuild de pe o mașină unde rulează .exe-ul meu?

Pot obține versiunea .NET din Environment, dar există o modalitate de a obține folderul corect pentru o versiune .NET?

22 răspunsuri
Brian

Răsfoind registrul, se pare că

HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSBuildToolsVersions2.0
HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSBuildToolsVersions3.5
HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSBuildToolsVersions4.0

ar putea fi ceea ce căutați; porniți regedit.exe și aruncați o privire.

Interogare prin linia de comandă (conform Nikolay Botev)

reg.exe query "HKLMSOFTWAREMicrosoftMSBuildToolsVersions4.0" /v MSBuildToolsPath

Interogare prin PowerShell (per MovGP0)

dir HKLM:SOFTWAREMicrosoftMSBuildToolsVersions

Comentarii

  • Am instalat Visual Studio 2017 RC și pornind Promptul de comandă pentru dezvoltatori, versiunea MSBuild este 15.+, dar această versiune nu apare în registru. Cum pot obține acces la același MSBuild pe care îl folosește Dev Cmd Prompt? –  > Por SuperJMN.
  • MSBuild 15 se află la `C:Program Files (x86)Microsoft Visual Studio2017EnterpriseMSBuild15.0Binamd64` –  > Por nZeus.
  • Doar dacă ați instalat VS2017 acolo, nu am putut găsi un singur punct de intrare în registru pentru MsBuildToolsPath pentru setul de instrumente 15.0 –  > Por Paciv.
  • docs.microsoft.com/en-us/visualstudio/msbuild/… „MSBuild este acum instalat într-un folder sub fiecare versiune de Visual Studio. De exemplu, C:Program Files (x86)Microsoft Visual Studio2017EnterpriseMSBuild” și „ToolsVersion values are no longer set in the registry” (Valorile ToolsVersion nu mai sunt setate în registru) – –  > Por Hulvej.
  • @O.R.Mapper Microsoft oferă un proiect pe GitHub pentru determinarea căilor de acces ale Visual Studio 2017/msbuild 15.x instanțe. Este vorba de un singur executabil care poate fi utilizat de software-ul/ scripturile de construire. –  > Por Roi Danton.
Nikolay Botev

De asemenea, puteți imprima calea MSBuild.exe în linia de comandă:

reg.exe query "HKLMSOFTWAREMicrosoftMSBuildToolsVersions4.0" /v MSBuildToolsPath

Comentarii

  • Vă rugăm să rețineți că, dacă doriți să construiți o aplicație pentru Windows Phone, care are nevoie de msbuild pe 32 de biți. Interogarea registrului oferă doar msbuild de 64 de biți pe o mașină de 64 de biți. –  > Por Victor Ionescu.
  • @VictorIonescu: Puteți folosi /reg:32 sau /reg:64 pe ambele biți de cmd (sau orice proces pe care îl executați) pentru a obține explicit calea respectivă. –  > Por Simon Buchan.
  • acest lucru vă va oferi calea către o locație veche (4.0) – cea pe care probabil o doriți este de fapt în altă parte vedeți stackoverflow.com/questions/32007871/… –  > Por JonnyRaa.
  • În cazul meu, era sub ComputerHKEY_LOCAL_MACHINESOFTWAREWOW6432NodeMicrosoftMSBuildToolsVersions4.0MSBuildToolsPath –  > Por Sen Jacob.
AllenSanborn

Dacă doriți să utilizați MSBuild pentru .Net 4, atunci puteți utiliza următoarea comandă PowerShell pentru a obține calea executabilului. Dacă doriți versiunea 2.0 sau 3.5, atunci trebuie doar să modificați variabila $dotNetVersion.

Pentru a rula executabilul, va trebui să prelungiți variabila $msbuild cu &. Aceasta va executa variabila.

# valid versions are [2.0, 3.5, 4.0]
$dotNetVersion = "4.0"
$regKey = "HKLM:softwareMicrosoftMSBuildToolsVersions$dotNetVersion"
$regProperty = "MSBuildToolsPath"

$msbuildExe = join-path -path (Get-ItemProperty $regKey).$regProperty -childpath "msbuild.exe"

&$msbuildExe

Comentarii

yoyo

Pentru scriptul cmd shell în Windows 7, folosesc următorul fragment în fișierul meu batch pentru a găsi MSBuild.exe în .NET Framework versiunea 4. Presupun că versiunea 4 este prezentă, dar nu presupun subversiunea. Acest lucru nu este în totalitate de uz general, dar pentru scripturi rapide poate fi util:

set msbuild.exe=
for /D %%D in (%SYSTEMROOT%Microsoft.NETFrameworkv4*) do set msbuild.exe=%%DMSBuild.exe

Pentru utilizările mele, ies din fișierul batch cu o eroare dacă nu a funcționat:

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

Comentarii

  • @yoyo Ce este set bb.build.msbuild.exe= pentru? Este necesar sau este doar un artefact al configurației tale? –  > Por Elisée.
  • @Elisée Oops, îmi pare rău, este o greșeală de copy/paste. În mediul meu numesc variabila bb.build.msbuild.exe, am neglijat să corectez această instanță când am lipit în răspuns. Fixat acum, mulțumesc pentru că ați subliniat asta. –  > Por yoyo.
Ian Kemp

Instrucțiuni pentru a găsi MSBuild:

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

Instrucțiuni pentru găsirea VSTest:

  • PowerShell: &"${env:ProgramFiles(x86)}Microsoft Visual StudioInstallervswhere.exe" -latest -prerelease -products * -requires Microsoft.VisualStudio.PackageGroup.TestTools.Core -find Common7IDECommonExtensionsMicrosoftTestWindowvstest.console.exe
  • CMD: "%ProgramFiles(x86)%Microsoft Visual StudioInstallervswhere.exe" -latest -prerelease -products * -requires Microsoft.VisualStudio.PackageGroup.TestTools.Core -find Common7IDECommonExtensionsMicrosoftTestWindowvstest.console.exe

(Rețineți că instrucțiunile de mai sus sunt ușor modificate față de cele oficiale ale Microsoft. În special, am inclus în instrucțiunile -prerelease pentru a permite preluarea instalațiilor Preview și RC, iar indicatorul -products * pentru a detecta instalațiile Visual Studio Build Tools).


A durat doar peste doi ani, dar în sfârșit în 2019, Microsoft a ascultat și ne-a oferit o modalitate de a găsi aceste executabile vitale! Dacă aveți instalat Visual Studio 2017 și/sau 2019, este posibil să se instaleze vswhere utilitar poate fi interogat pentru a afla locația MSBuild et al. Deoarece vswhere este garantat de Microsoft că se află la adresa %ProgramFiles(x86)%Microsoft Visual StudioInstallervswhere.exe, nu mai este nevoie de bootstrap și nici de hardcoding de cale.

Magia constă în faptul că -find parametru, adăugat în versiunea 2.6.2. Puteți determina versiunea pe care ați instalat-o rulând vswheresau verificând proprietățile fișierului său. Dacă aveți o versiune mai veche, puteți pur și simplu să o descărcați pe cea mai recentă și să suprascrieți fișierul existent %ProgramFiles(x86)%Microsoft Visual StudioInstallervswhere.exe.

vswhere.exe este un executabil de sine stătător, astfel încât îl puteți descărca și rula de oriunde aveți o conexiune la internet. Asta înseamnă că scripturile dvs. de compilare pot verifica dacă mediul în care rulează este configurat corect, pentru a numi o opțiune.

Comentarii

  • Există deja 3 răspunsuri care menționează vswhere, inclusiv comentariul dvs. în acest sens la unul dintre ele. Adăugarea acestui răspuns nu face decât să înrăutățească supa de răspunsuri. –  > Por jpaugh.
  • 4 acum. Acest răspuns mi s-a părut util, în timp ce celelalte răspunsuri vswhere nu mi s-au părut utile. –  > Por cowlinator.
  • Merită menționat faptul că doar pentru că VSWHERE spune că este msbuild.exe de utilizat, nu înseamnă că dacă tastați msbuild la linia de comandă (în special la linia de comandă Visual Studio, dacă o utilizați), acela este cel care va fi utilizat. Pentru a vedea ce se utilizează dacă tastați msbuild la linia de comandă, faceți următoarele: where msbuild. Dacă nu se raportează același lucru pe care VSWHERE spune că este cel mai recent și cel mai bun, atunci fie trebuie să faceți o cale completă către fișierul msbuild.exe pe care doriți să o utilizați, fie să faceți ajustări la variabilele PATH pentru a se potrivi. –  > Por Jinlye.
  • Așadar, următoarea întrebare este cum găsiți calea către vswhere…. –  > Por BJury.
  • @BJury Microsoft garantează că va fi întotdeauna la „C:Program Files (x86)Microsoft Visual StudioInstallervswhere.exe”. Acesta este punctul de plecare. Alternativ, așa cum se menționează în ultimele 2 paragrafe, puteți descărca vswhere.exe și să îl utilizați direct. –  > Por Ian Kemp.
hdev

Puteți utiliza această comandă PowerShell foarte încercată pentru a obține MSBuildToolsPath din registru.

PowerShell (din registru)

Resolve-Path HKLM:SOFTWAREMicrosoftMSBuildToolsVersions* | 
Get-ItemProperty -Name MSBuildToolsPath

Ieșire

MSBuildToolsPath : C:Program Files (x86)MSBuild12.0binamd64
PSPath           : Microsoft.PowerShell.CoreRegistry::HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSBuildToolsVersions12.0
PSParentPath     : Microsoft.PowerShell.CoreRegistry::HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSBuildToolsVersions
PSChildName      : 12.0
PSDrive          : HKLM
PSProvider       : Microsoft.PowerShell.CoreRegistry

MSBuildToolsPath : C:Program Files (x86)MSBuild14.0binamd64
PSPath           : Microsoft.PowerShell.CoreRegistry::HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSBuildToolsVersions14.0
PSParentPath     : Microsoft.PowerShell.CoreRegistry::HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSBuildToolsVersions
PSChildName      : 14.0
PSDrive          : HKLM
PSProvider       : Microsoft.PowerShell.CoreRegistry

MSBuildToolsPath : C:WindowsMicrosoft.NETFramework64v2.0.50727
PSPath           : Microsoft.PowerShell.CoreRegistry::HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSBuildToolsVersions2.0
PSParentPath     : Microsoft.PowerShell.CoreRegistry::HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSBuildToolsVersions
PSChildName      : 2.0
PSDrive          : HKLM
PSProvider       : Microsoft.PowerShell.CoreRegistry

MSBuildToolsPath : C:WindowsMicrosoft.NETFramework64v3.5
PSPath           : Microsoft.PowerShell.CoreRegistry::HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSBuildToolsVersions3.5
PSParentPath     : Microsoft.PowerShell.CoreRegistry::HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSBuildToolsVersions
PSChildName      : 3.5
PSDrive          : HKLM
PSProvider       : Microsoft.PowerShell.CoreRegistry

MSBuildToolsPath : C:WindowsMicrosoft.NETFramework64v4.0.30319
PSPath           : Microsoft.PowerShell.CoreRegistry::HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSBuildToolsVersions4.0
PSParentPath     : Microsoft.PowerShell.CoreRegistry::HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSBuildToolsVersions
PSChildName      : 4.0
PSDrive          : HKLM
PSProvider       : Microsoft.PowerShell.CoreRegistry

sau din sistemul de fișiere

PowerShell (din sistemul de fișiere)

Resolve-Path "C:Program Files (x86)MSBuild*Binamd64MSBuild.exe"
Resolve-Path "C:Program Files (x86)MSBuild*BinMSBuild.exe"

Ieșire

Path
----
C:Program Files (x86)MSBuild12.0Binamd64MSBuild.exe
C:Program Files (x86)MSBuild14.0Binamd64MSBuild.exe
C:Program Files (x86)MSBuild12.0BinMSBuild.exe
C:Program Files (x86)MSBuild14.0BinMSBuild.exe

Comentarii

  • Cel mai bun răspuns pe această temă. –  > Por Teoman shipahi.
JJS

@AllenSanborn are o versiune powershell grozavă, dar unii oameni au cerința de a folosi numai scripturi batch pentru compilări.

Aceasta este o versiune aplicată a ceea ce a răspuns @bono8106.

msbuildpath.bat

@echo off

reg.exe query "HKLMSOFTWAREMicrosoftMSBuildToolsVersions14.0" /v MSBuildToolsPath > nul 2>&1
if ERRORLEVEL 1 goto MissingMSBuildRegistry

for /f "skip=2 tokens=2,*" %%A in ('reg.exe query "HKLMSOFTWAREMicrosoftMSBuildToolsVersions14.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

Pentru Visual Studio 2017 / MSBuild 15, Aziz Atif (tipul care a scris Elmah) a scris un script 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 Studio2017%%eMSBuild15.0BinMSBuild.exe" (
        set "MSBUILD=%PROGRAMS%Microsoft Visual Studio2017%%eMSBuild15.0BinMSBuild.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

Comentarii

Raman Zhylich

Acest lucru funcționează pentru Visual Studio 2015 și 2017:

function Get-MSBuild-Path {

    $vs14key = "HKLM:SOFTWAREMicrosoftMSBuildToolsVersions14.0"
    $vs15key = "HKLM:SOFTWAREwow6432nodeMicrosoftVisualStudioSxSVS7"

    $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 "MSBuild15.0binamd64msbuild.exe"
        }
    }

    return $msbuildPath

}

Comentarii

  • Pentru VS2017, consultați și VS2017: github.com/Microsoft/vswhere, github.com/Microsoft/vssetup.powershell, și github.com/deadlydog/Invoke-MsBuild –  > Por Ian Kemp.
  • Pentru Instrumente de construire, utilizați vswhere -products *, așa cum se specifică în github.com/Microsoft/vswhere/wiki/Find-MSBuild. –  > Por TN..
  • Pentru vswhere trebuie să știți calea în care se află. Și, bineînțeles, ar trebui să aveți power-shell disponibil pentru sistemul dvs. de construire. O singură întrebare: de ce amd64? Are ceva specific pentru construire? –  > Por Maxim.
  • Upvoted pentru că această soluție folosește în esență doar o cheie de registru și pentru MSBuild 15, nu o bibliotecă sau un script terță parte. Din curiozitate, la ce se referă „SxSVS7”? Va rămâne valabil în toate versiunile VS? –  > Por Lazlo.
Paulo Santos

Locațiile registrului

HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSBuildToolsVersions2.0
HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSBuildToolsVersions3.5

oferă locația pentru executabil.

Dar dacă aveți nevoie de locația în care să salvați extensiile Task, aceasta se află pe

%ProgramFiles%MSBuild

Comentarii

  • Este destul de vechi, știu – dar oricum: pe sistemele x64, folderul MSBuild este localizat în ProgramFiles(x86) –  > Por Sascha.
MovGP0

cea mai ușoară cale ar putea fi să deschideți PowerShell și să introduceți

dir HKLM:SOFTWAREMicrosoftMSBuildToolsVersions

SeriousM

Un one-liner bazat pe răspunsul lui @dh_cgn:

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

Selectează toate căile de acces existente de ex. C:Program Files (x86)Microsoft Visual Studio**MSBuild*binmsbuild.exe.

Stelele wildcards sunt:

  • anul (2017)
  • ediția visual studio (community, professional, enterprise)
  • versiunea instrumentelor (15.0)

Rețineți că această comandă selectează prima cale care se potrivește cu expresia ordonată după alfabet. Pentru a restrânge căutarea, trebuie doar să înlocuiți caracterele sălbatice cu elemente specifice, de exemplu, anul sau versiunea instrumentelor.

cowlinator

Începând cu MSBuild 2017 (v15), MSBuild este acum instalat într-un folder sub fiecare versiune de Visual Studio

Iată câteva exemple de unde se găsește MSBuild.exe pe mașina mea:

C:windowsMicrosoft.NETFrameworkv2.0.50727MSBuild.exe  (v2.0.50727.8745  32-bit)
C:windowsMicrosoft.NETFramework64v2.0.50727MSBuild.exe  (v2.0.50727.8745  64-bit)
C:WindowsMicrosoft.NETFrameworkv3.5MSBuild.exe  (v3.5.30729.8763 32-bit)
C:WindowsMicrosoft.NETFramework64v3.5MSBuild.exe  (v3.5.30729.8763 64-bit)
C:WindowsMicrosoft.NETFrameworkv4.0.30319MSBuild.exe  (v4.7.2053.0 32-bit)
C:WindowsMicrosoft.NETFramework64v4.0.30319MSBuild.exe  (v4.7.2053.0 64-bit)
C:Program Files (x86)MSBuild12.0BinMSBuild.exe  (v12.0.21005.1 32-bit)
C:Program Files (x86)MSBuild12.0Binamd64MSBuild.exe (v12.0.21005.1 64-bit)
C:Program Files (x86)MSBuild14.0BinMSBuild.exe  (v14.0.25420.1 32-bit)
C:Program Files (x86)MSBuild14.0Binamd64MSBuild.exe  (v14.0.25420.1 64-bit)
C:Program Files (x86)Microsoft Visual Studio2017BuildToolsMSBuild15.0BinMSBuild.exe  (v15.1.1012+g251a9aec17 32-bit)
C:Program Files (x86)Microsoft Visual Studio2017BuildToolsMSBuild15.0Binamd64MSBuild.exe (v15.1.1012+g251a9aec17 64-bit)
C:Program Files (x86)Microsoft Visual Studio2017{LicenceName}MSBuildBinMSBuild.exe (v15.1.1012.6693 32-bit)
C:Program Files (x86)Microsoft Visual Studio2017{LicenceName}MSBuildBinamd64MSBuild.exe (v15.1.1012.6693 64-bit)

Comentarii

  • Conform unui răspuns anterior, 2017 face stochează, de fapt, aceste informații în registru. –  > Por jpaugh.
draganicimw

Pe Windows 2003 și mai târziu, tastați această comandă în cmd:

cmd> where MSBuild
Sample result: C:WindowsMicrosoft.NETFrameworkv4.0.30319MSBuild.exe

Dacă nu apare nimic, înseamnă că .NET framework nu este inclus în PATH-ul sistemului. MSBuild ar trebui să se afle în folderul de instalare .NET, împreună cu compilatoarele .NET (vbc.exe, csc.exe)

Comentarii

  • Acest răspuns nu adaugă prea multe față de alte răspunsuri. Este mai puțin robust decât acest răspuns –  > Por jpaugh.
Roi Danton

Pentru a prelua calea de acces a msbuild 15 (Visual Studio 2017) cu lotul din registru fără instrumente suplimentare:

set regKey=HKLMSOFTWAREWOW6432NodeMicrosoftVisualStudioSxSVS7
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%MSBuild15.0BinMSBuild.exe

Instrumente mai bune disponibile:

Comentarii

  • Mi-ai salvat viața…  > Por Hakan Fıstık.
  • Există deja o versiune PowerShell a acestui lucru. Circa 2017, există vreun motiv pentru a evita să înveți Powershell? –  > Por jpaugh.
  • @jpaugh Nu toate sistemele de compilare au PowerShell disponibil. –  > Por Roi Danton.
Neil Barnwell

Nu ați crede că sunt multe de adăugat aici, dar poate că este timpul pentru o modalitate unificată de a face acest lucru în toate versiunile. Am combinat abordarea de interogare a registrului (VS2015 și versiunile ulterioare) cu utilizarea lui vswhere (VS2017 și mai sus) pentru a ajunge la acest lucru:

function Find-MsBuild {
    Write-Host "Using VSWhere to find msbuild..."
    $path = & $vswhere -latest -requires Microsoft.Component.MSBuild -find MSBuild**BinMSBuild.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:SOFTWAREMicrosoftMSBuildToolsVersions* |
                    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
}

Martin Brandl

Există multe răspunsuri corecte. Cu toate acestea, iată un One-Liner în PowerShell pe care îl folosesc pentru a determina calea MSBuild pentru cea mai recentă versiune:

Get-ChildItem 'HKLM:SOFTWAREMicrosoftMSBuildToolsVersions' | 
    Get-ItemProperty -Name MSBuildToolsPath | 
    Sort-Object PSChildName | 
    Select-Object -ExpandProperty MSBuildToolsPath -first 1

Comentarii

  • +1 Foarte util! Dar în răspunsul meu folosesc -last 1 (în loc de -first 1 pentru a obține cea mai recentă versiune) și, de asemenea, concatenez numele fișierului (pentru a obține în mod corespunzător calea completă și nu doar folderul). –  > Por Mariano Desanze.
Mariano Desanze

Această metodă powershell obține calea către msBuild din mai multe surse. Încercând în ordine:

  1. Mai întâi folosind vswhere (deoarece Visual Studio pare să aibă versiuni mai actualizate ale msBuild), de ex.

    C:Program Files (x86)Microsoft Visual Studio2017ProfessionalMSBuild15.0BinMSBuild.exe
    
  2. Dacă nu se găsește, încercând registrul (versiunea framework-ului), de ex.

    C:WindowsMicrosoft.NETFramework64v4.0.30319msbuild.exe
    

Codul Powershell:

Function GetMsBuildPath {

    Function GetMsBuildPathFromVswhere {
        # Based on https://github.com/microsoft/vswhere/wiki/Find-MSBuild/62adac8eb22431fa91d94e03503d76d48a74939c
        $vswhere = "${env:ProgramFiles(x86)}Microsoft Visual StudioInstallervswhere.exe"
        $path = & $vswhere -latest -prerelease -products * -requires Microsoft.Component.MSBuild -property installationPath
        if ($path) {
            $tool = join-path $path 'MSBuildCurrentBinMSBuild.exe'
            if (test-path $tool) {
                return $tool
            }
            $tool = join-path $path 'MSBuild15.0BinMSBuild.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:SOFTWAREMicrosoftMSBuildToolsVersions' |
            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
}

Ernstjan Freriks

Pentru Visual Studio 2017, fără a cunoaște ediția exactă, ați putea folosi acest lucru într-un script batch:

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

Comanda findstr are rolul de a ignora anumite executabile msbuild (în acest exemplu, amd64).

Shamork.Fu

adăugați ramura vswhere pentru https://github.com/linqpadless/LinqPadless/blob/master/build.cmd, funcționează bine în computerul meu, iar ramura vswhere funcționează pe computerul colegului meu. poate, ramura vswhere ar trebui să avanseze ca primă verificare.

@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 Studio2017%%eMSBuild15.0BinMSBuild.exe" (
        set "MSBUILD=%PROGRAMS%Microsoft Visual Studio2017%%eMSBuild15.0BinMSBuild.exe"
    )
)
if exist "%MSBUILD%" goto :build

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

if exist "%InstallDir%MSBuild15.0BinMSBuild.exe" (
  set "MSBUILD=%InstallDir%MSBuild15.0BinMSBuild.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

Stas BZ

Obțineți cea mai recentă versiune de MsBuild. cel mai bun mod, pentru toate tipurile de instalare msbuild, pentru diferite arhitecturi de procesor (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*Binmsbuild.exe" -ErrorAction SilentlyContinue) +
            @(Resolve-Path "${Env:ProgramFiles(x86)}MSBuild*BinMSBuild.exe" -ErrorAction SilentlyContinue) +
            @(Resolve-Path "${Env:windir}Microsoft.NETFramework*MSBuild.exe" -ErrorAction SilentlyContinue)
        }
        8 {
            $msbuildPathes =
            @(Resolve-Path "${Env:ProgramFiles(x86)}Microsoft Visual Studio**MSBuild*Binamd64msbuild.exe" -ErrorAction SilentlyContinue) +
            @(Resolve-Path "${Env:ProgramFiles(x86)}MSBuild*Binamd64MSBuild.exe" -ErrorAction SilentlyContinue) +
            @(Resolve-Path "${Env:windir}Microsoft.NETFramework64*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;
}

Dan Diplo

Dacă sunteți aventuros, puteți, de asemenea, să obțineți codul sursă și cea mai recentă versiune a MsBuild de pe GitHub acum la adresa https://github.com/Microsoft/msbuild/releases/

Comentarii

  • Nu răspunde la niciuna dintre întrebările lui OP –  > Por Alan Macdonald.
Nashev

Dacă doriți să compilați un proiect Delphi, uitați-vă la „ERROR MSB404040 There is no target in the project” atunci când utilizați msbuild+Delphi2009

Răspunsul corect acolo se spune: „Există un fișier batch numit rsvars.bat (căutați-l în dosarul RAD Studio). Apelați-l înainte de a apela MSBuild și acesta va configura variabilele de mediu necesare. Asigurați-vă că dosarele sunt corecte în rsvars.bat dacă aveți compilatorul într-o locație diferită de cea implicită.”

Acest bat nu numai că va actualiza variabila de mediu PATH în folderul .NET corespunzător cu versiunea corectă a MSBuild.exe, dar înregistrează și alte variabile necesare.

Comentarii

  • Acest răspuns nu este legat de Delphi și nu este mai robust pentru utilizatorii Delphi. –  > Por Nashev.
  • Îmi pare rău că am fost laconic. Am vrut să spun mai robust, adică funcționează pentru mai mult decât pentru Delphi. S-ar putea să existe o modalitate mai ușoară de a face acest lucru în Delphi, dar OP nu a întrebat despre Delphi, iar acest fir de discuție are 18 răspunsuri pe care puțini le vor vedea vreodată. Dacă este important pentru tine ca alții să vadă asta, îți recomand să creezi o nouă întrebare specifică pentru Delphi și să răspunzi singur. Dacă am ajunge la 6 sau mai puține răspunsuri care să acopere fiecare versiune de MSBuild, aș fi foarte fericit -.  > Por jpaugh.