Pfad zu MSBuild


186

Wie kann ich den Pfad zu MSBuild programmgesteuert von einem Computer abrufen, auf dem meine EXE-Datei ausgeführt wird?

Ich kann die .NET-Version aus der Umgebung abrufen. Gibt es jedoch eine Möglichkeit, den richtigen Ordner für eine .NET-Version abzurufen?

Antworten:


141

Es sieht so aus, als würde man in der Registrierung stöbern

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

kann sein, wonach Sie suchen; Starten Sie regedit.exe und schauen Sie.

Abfrage über Kommandozeile (per Nikolay Botev )

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

Abfrage über PowerShell (per MovGP0 )

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

5
Ich habe Visual Studio 2017 RC installiert und die Eingabeaufforderung für Entwickler gestartet. Die MSBuild-Version ist 15. +, aber diese Version wird nicht in der Registrierung angezeigt. Wie erhalte ich Zugriff auf dasselbe MSBuild, das von der Dev Cmd-Eingabeaufforderung verwendet wird?
SuperJMN

6
MSBuild 15 befindet sich unter `C: \ Programme (x86) \ Microsoft Visual Studio \ 2017 \ Enterprise \ MSBuild \ 15.0 \ Bin \ amd64`
nZeus

2
Nur wenn Sie dort VS2017 installiert haben, konnte ich keinen einzigen Einstiegspunkt in der Registrierung für MsBuildToolsPath für das 15.0-Toolset finden
Paciv

8
docs.microsoft.com/en-us/visualstudio/msbuild/… "MSBuild wird jetzt in einem Ordner unter jeder Version von Visual Studio installiert. Beispiel: C: \ Programme (x86) \ Microsoft Visual Studio \ 2017 \ Enterprise \ MSBuild "und" ToolsVersion Werte sind nicht mehr in der Registrierung festgelegt "
Hulvej

2
@ORMapper Microsoft bietet auf GitHub ein Projekt zum Ermitteln von Pfaden für Visual Studio 2017 / msbuild 15.x- Instanzen an. Es ist eine einzelne ausführbare Datei, die von Ihrer Build-Software / Ihren Skripten verwendet werden kann.
Roi Danton

140

Sie können auch den Pfad von MSBuild.exe zur Befehlszeile drucken:

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

1
Bitte beachten Sie, dass zum Erstellen einer Windows Phone-App die 32-Bit-msbuild erforderlich ist. Beim Abfragen der Registrierung wird nur der 64-Bit-msbuild auf einem 64-Bit-Computer angezeigt.
Victor Ionescu

2
@ VictorIonescu: Sie können /reg:32oder /reg:64bei beiden Bitnessess von cmd(oder einem beliebigen Prozess, den Sie ausführen ) diesen Pfad explizit abrufen .
Simon Buchan

Dies gibt Ihnen den Weg zu einem alten (4.0) Ort - der, den Sie wahrscheinlich wollen, ist tatsächlich woanders, siehe stackoverflow.com/questions/32007871/…
JonnyRaa

In meinem Fall war es unterComputer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\MSBuild\ToolsVersions\4.0\MSBuildToolsPath
Sen Jacob

32

Wenn Sie MSBuild für .Net 4 verwenden möchten, können Sie den folgenden PowerShell-Befehl verwenden, um den Pfad der ausführbaren Datei abzurufen. Wenn Sie Version 2.0 oder 3.5 möchten, ändern Sie einfach die Variable $ dotNetVersion.

Um die ausführbare Datei auszuführen, müssen Sie der Variablen $ msbuild & voranstellen. Dadurch wird die Variable ausgeführt.

# 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
funktioniert auch für $dotNetVersion12.0 (vs 2013) und 14.0 (vs 2015) (falls natürlich installiert)
Julian

4
Funktioniert nicht für VS 2017, das keinen Wert unter dem HKLM:\software\Microsoft\MSBuild\ToolsVersionsSchlüssel hinzufügt . Stattdessen müssen Sie das VS2017-Installationsverzeichnis von abrufen HKLM:\SOFTWARE\WOW6432Node\Microsoft\VisualStud‌​io\SxS\VS7\15.0und dann anhängen MSBuild\15.0\Bin\MSBuild.exe, um den MSBuild EXE-Speicherort abzurufen .
Ian Kemp

30

Für Cmd-Shell-Skripte in Windows 7 verwende ich das folgende Fragment in meiner Batch-Datei, um MSBuild.exe in .NET Framework Version 4 zu finden. Ich gehe davon aus, dass Version 4 vorhanden ist, aber nicht von der Unterversion. Dies ist kein allgemeiner Zweck, aber für schnelle Skripte kann es hilfreich sein:

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

Für meine Zwecke beende ich die Batch-Datei mit einem Fehler, wenn dies nicht funktioniert hat:

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 Wofür set bb.build.msbuild.exe=? Ist es erforderlich oder nur ein Artefakt Ihres Setups?
Elisée

@ Elisée Ups, sorry, das ist ein Tippfehler zum Kopieren / Einfügen. In meiner Umgebung rufe ich die Variable bb.build.msbuild.exe auf. Ich habe es versäumt, diese Instanz zu reparieren, als ich sie in die Antwort eingefügt habe. Jetzt behoben, danke für den Hinweis.
Joo

26

Sie können diesen sehr bewährten PowerShell-Befehl verwenden, um das zu erhalten MSBuildToolsPath aus der Registrierung abzurufen.

PowerShell (aus der Registrierung)

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

Ausgabe

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

oder aus dem Dateisystem

PowerShell (aus dem Dateisystem)

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

Ausgabe

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
Die beste Antwort zu diesem Thema.
Teoman Shipahi

19

Anweisungen zum Auffinden von MSBuild :

  • Power Shell: &"${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

Anweisungen zum Auffinden von VSTest :

  • Power Shell: &"${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

(Beachten Sie, dass die obigen Anweisungen geringfügig von den offiziellen Anweisungen von Microsoft abweichen. Insbesondere habe ich das -prereleaseFlag eingefügt, damit Preview- und RC-Installationen abgerufen werden können, und das -products *, um Visual Studio Build Tools-Installationen zu erkennen.)


Es hat nur über zwei Jahre gedauert, aber schließlich hat Microsoft 2019 zugehört und uns eine Möglichkeit gegeben, diese wichtigen ausführbaren Dateien zu finden ! Wenn Sie Visual Studio 2017 und / oder 2019 installiert haben, kann das vswhereDienstprogramm nach dem Speicherort von MSBuild et al. Abgefragt werden. Da vswhere sich immer bei %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe befindet, ist kein Bootstrapping und keine Pfad-Hardcodierung mehr erforderlich.

Die Magie ist der -findParameter, der in Version 2.6.2 hinzugefügt wurde . Sie können die installierte Version ermitteln vswhere, indem Sie sie ausführen oder ihre Dateieigenschaften überprüfen. Wenn Sie eine ältere Version haben, können Sie einfach die neueste herunterladen und die vorhandene überschreiben %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe.

vswhere.exeist eine eigenständige ausführbare Datei, sodass Sie sie von jedem Ort herunterladen und ausführen können, an dem Sie über eine Internetverbindung verfügen. Das bedeutet, dass Ihre Build-Skripte überprüfen können, ob die Umgebung, in der sie ausgeführt werden, korrekt eingerichtet ist, um nur eine Option zu nennen.


Es gibt bereits 3 Antworten, in denen vswhere erwähnt wird, einschließlich Ihres entsprechenden Kommentars unter einer davon. Das Hinzufügen dieser Antwort macht die Antwortsuppe nur noch schlimmer.
Jpaugh

4
4 jetzt. Ich fand diese Antwort hilfreich, während ich die anderen vswhere-Antworten nicht hilfreich fand.
Cowlinator

Es ist erwähnenswert, dass nur, weil VSWHERE angibt, dass dies die zu verwendende msbuild.exe ist, dies nicht bedeutet, dass wenn Sie msbuildin der Befehlszeile (insbesondere in der Visual Studio-Befehlszeile, wenn Sie diese verwenden) eingeben, diese verwendet wird. Gehen Sie folgendermaßen vor, um zu sehen, was verwendet wird, wenn Sie msbuildin die Befehlszeile eingeben where msbuild. Wenn dies nicht dasselbe ist, wie VSWHERE sagt, dass es das Neueste und Beste ist, müssen Sie entweder einen vollständigen Pfad zu dem msbuild.exezu verwendenden Pfad erstellen oder Ihre PATH-Variablen entsprechend anpassen.
Jinlye

Die nächste Frage ist also, wie Sie den Weg zu vswhere finden.
BJury

17

@AllenSanborn hat eine großartige Powershell-Version, aber einige Leute müssen nur Batch-Skripte für Builds verwenden.

Dies ist eine angewandte Version dessen, was @ bono8106 beantwortet hat.

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

Für Visual Studio 2017 / MSBuild 15 hat Aziz Atif (der Typ, der Elmah geschrieben hat ) ein Batch-Skript geschrieben

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
Hinweis: Da VS2017 / msbuild 15.x die Registrierung nicht für ihre Pfade verwendet, ist vswhere eine Alternative zum Ermitteln des msbuild-Pfads.
Roi Danton

1
Auch AzizAtif ist der Mann. Werfen Sie einen Blick darauf für 15.1 Builds - github.com/linqpadless/LinqPadless/blob/master/build.cmd
JJS

2
Auch kann vswhere über Chocolatey installiert werden: chocolatey.org/packages/vswhere
cowlinator

6

Dies funktioniert für Visual Studio 2015 und 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
Verwenden Sie für Build-Tools vswhere -products *die Angaben in github.com/Microsoft/vswhere/wiki/Find-MSBuild .
TN.

Für vswhere sollten Sie den Pfad kennen, in dem es sich befindet. Und natürlich sollten Sie Power-Shell für Ihr Build-System zur Verfügung haben. Nur eine Frage: Warum amd64? Hat es etwas Spezielles zum Bauen?
Maxim

Upvoted, da diese Lösung im Wesentlichen nur einen Registrierungsschlüssel für MSBuild 15 verwendet, keine Bibliothek oder ein Skript eines Drittanbieters. Worauf bezieht sich "SxS \ VS7" aus Neugier? Bleibt das für alle VS-Versionen gültig?
Lazlo

5

Die Registrierungsspeicherorte

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

Geben Sie den Speicherort für die ausführbare Datei an.

Wenn Sie jedoch den Speicherort für die Aufgabenerweiterungen benötigen, ist dieser aktiviert

%ProgramFiles%\MSBuild

4
Es ist ziemlich alt, ich weiß - aber trotzdem: Auf x64-Systemen befindet sich der MSBuild-Ordner in ProgramFiles (x86)
Sascha

4

Am einfachsten ist es, PowerShell zu öffnen und einzutreten

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

4

Ein Einzeiler basierend auf der Antwort von @ dh_cgn :

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

Es wählt alle vorhandenen Pfade aus. C:\Program Files (x86)\Microsoft Visual Studio\*\*\MSBuild\*\bin\msbuild.exe.

Die Wildcard-Sterne sind:

  • das Jahr (2017)
  • die Visual Studio Edition (Community, Professional, Enterprise)
  • die Tools-Version (15.0)

Beachten Sie, dass dieser Befehl den ersten Pfad auswählt, der dem nach Alphabet geordneten Ausdruck entspricht. Um es einzugrenzen, ersetzen Sie einfach die Platzhalter durch bestimmte Elemente, z. das Jahr oder die Werkzeugversion.


3

Geben Sie unter Windows 2003 und höher diesen Befehl in cmd ein:

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

Wenn nichts angezeigt wird, bedeutet dies, dass .NET Framework nicht im Systempfad enthalten ist. Das MSBuild sollte sich zusammen mit .NET-Compilern (vbc.exe, csc.exe) im .NET-Installationsordner befinden.


Diese Antwort fügt anderen Antworten nicht viel hinzu. Es ist weniger robust als diese Antwort
jpaugh

3

Ab MSBuild 2017 (v15) wird MSBuild jetzt in einem Ordner unter jeder Version von Visual Studio installiert

Hier sind einige Beispiele, wo sich MSBuild.exe auf meinem Computer befindet:

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)

Nach einer früheren Antwort 2017 hat in der Tat speichert diese Informationen in der Registrierung.
Jpaugh

2

So rufen Sie den Pfad von msbuild 15 (Visual Studio 2017) mit Batch aus der Registrierung ohne zusätzliche Tools ab:

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

Besser verfügbare Tools:


1
Du hast mein Leben gerettet
Hakan Fıstık

Es gibt bereits eine PowerShell- Version davon. Gibt es um 2017 einen Grund, Powershell nicht zu lernen?
Jpaugh

2
@jpaugh Nicht für jedes Build-System ist PowerShell verfügbar.
Roi Danton

1

Sie würden nicht denken, dass es hier viel hinzuzufügen gibt, aber vielleicht ist es Zeit für eine einheitliche Vorgehensweise in allen Versionen. Ich habe den Registrierungsabfrage-Ansatz (VS2015 und niedriger ) mit der Verwendung von vswhere (VS2017 und höher) kombiniert, um Folgendes zu erreichen:

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

Es gibt viele richtige Antworten. Hier jedoch ein Einzeiler in PowerShell, mit dem ich den MSBuild-Pfad für die neueste Version ermittle :

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

+1 Wirklich nützlich! Aber in meiner Antwort verwende ich -last 1(anstatt -first 1um die neueste Version zu erhalten) und verkette auch den Dateinamen (um den vollständigen Pfad und nicht nur den Ordner richtig zu erhalten).
Mariano Desanze

1

Diese Powershell-Methode ruft den Pfad zu msBuild aus mehreren Quellen ab. In der richtigen Reihenfolge versuchen:

  1. Verwenden Sie zuerst vswhere (da Visual Studio aktuellere Versionen von msBuild zu haben scheint), z

    C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\MSBuild.exe
  2. Wenn nicht gefunden, versuchen Sie es mit der Registrierung (Framework-Version), z

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

Powershell-Code:

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

Für Visual Studio 2017, ohne die genaue Edition zu kennen, können Sie dies in einem Batch-Skript verwenden:

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

Mit dem Befehl findstr werden bestimmte ausführbare Dateien von msbuild ignoriert (in diesem Beispiel amd64).


0

Fügen Sie den vswhere-Zweig für https://github.com/linqpadless/LinqPadless/blob/master/build.cmd hinzu , funktioniert auf meinem Computer einwandfrei, und der vswhere-Zweig funktioniert auf dem Computer meines Partners. Möglicherweise sollte der vswhere-Zweig als erste Überprüfung vorwärts gehen.

@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

Holen Sie sich die neueste Version von MsBuild. Bester Weg für alle Arten der msbuild-Installation für unterschiedliche Prozessorarchitekturen (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

Wenn Sie ein Delphi-Projekt kompilieren möchten, lesen Sie "FEHLER MSB4040 Es gibt kein Ziel im Projekt", wenn Sie msbuild + Delphi2009 verwenden

Die richtige Antwort lautet: "Es gibt eine Batch-Datei namens rsvars.bat (suchen Sie im RAD Studio-Ordner danach). Rufen Sie diese auf, bevor Sie MSBuild aufrufen, und es werden die erforderlichen Umgebungsvariablen eingerichtet. Stellen Sie sicher, dass die Ordner in rsvars korrekt sind .bat, wenn sich der Compiler an einem anderen als dem Standardspeicherort befindet. "

Dieser Bat aktualisiert nicht nur die Umgebungsvariable PATH in den richtigen .NET-Ordner mit der richtigen MSBuild.exe-Version, sondern registriert auch andere erforderliche Variablen.


Diese Antwort bezieht sich nicht auf Delphi und ist für Delphi-Benutzer nicht robuster.
Nashev

2
Tut mir leid, dass ich knapp bin. Ich meinte robuster als in, arbeitet für mehr als nur Delphi. Es mag einen einfacheren Weg geben, dies in Delphi zu tun, aber das OP hat nicht nach Delphi gefragt, und dieser Thread enthält 18 Antworten, die nur wenige jemals sehen werden. Wenn es Ihnen wichtig ist, dass andere dies sehen, würde ich empfehlen, dass Sie eine neue Delphi-spezifische Frage erstellen und sich selbst beantworten. Wenn wir auf 6 oder weniger Antworten kommen würden, die jede Version von MSBuild
abdecken
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.