Ścieżka do MSBuild


186

Jak mogę programowo uzyskać ścieżkę do MSBuild z komputera, na którym działa mój plik .exe?

Mogę pobrać wersję .NET ze środowiska, ale czy istnieje sposób na uzyskanie odpowiedniego folderu dla wersji .NET?

Odpowiedzi:


141

Wygląda na to, że przeszukuje rejestr

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

może być tym, czego szukasz; odpal regedit.exe i spójrz.

Zapytanie za pomocą wiersza poleceń (na Nikolay Botev )

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

Zapytanie za pomocą PowerShell (na MovGP0 )

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

5
Zainstalowałem Visual Studio 2017 RC i uruchamiam Wiersz polecenia programisty, wersja MSBuild to 15. +, ale ta wersja nie jest wyświetlana w rejestrze. Jak uzyskać dostęp do tego samego pakietu MSBuild, z którego korzysta wiersz polecenia Dev Cmd?
SuperJMN

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

2
Tylko jeśli zainstalowano tam VS2017, nie mogłem znaleźć w rejestrze jednego punktu wejścia dla MsBuildToolsPath dla zestawu narzędzi 15.0
Paciv

8
docs.microsoft.com/en-us/visualstudio/msbuild/… „MSBuild jest teraz instalowany w folderze w każdej wersji programu Visual Studio. Na przykład C: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Enterprise \ MSBuild ”i„ ToolsVersion wartości nie są już ustawione w rejestrze ”
Hulvej

2
@ORMapper Microsoft oferuje projekt na GitHub do określania ścieżek instancji Visual Studio 2017 / msbuild 15.x. Jest to pojedynczy plik wykonywalny, z którego może korzystać oprogramowanie / skrypty kompilacji.
Roi Danton,

140

Możesz także wydrukować ścieżkę MSBuild.exe do wiersza poleceń:

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

1
Pamiętaj, że jeśli chcesz zbudować aplikację dla systemu Windows Phone, potrzebujesz 32-bitowej msbuild. Zapytanie do rejestru daje tylko 64-bitową wersję msbuild na 64-bitowym komputerze.
Victor Ionescu,

2
@VictorIonescu: Można użyć /reg:32albo /reg:64na obu bitnessess z cmd(lub cokolwiek przetworzyć używasz), aby wyraźnie się tą drogą.
Simon Buchan,

da ci to ścieżkę do starej (4.0) lokalizacji - ta, którą prawdopodobnie chcesz, znajduje się gdzie indziej, patrz stackoverflow.com/questions/32007871/…
JonnyRaa

W moim przypadku było poniżejComputer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\MSBuild\ToolsVersions\4.0\MSBuildToolsPath
Sen Jacob

32

Jeśli chcesz użyć MSBuild dla .Net 4, możesz użyć następującego polecenia PowerShell, aby uzyskać ścieżkę do pliku wykonywalnego. Jeśli chcesz wersji 2.0 lub 3.5, po prostu zmień zmienną $ dotNetVersion.

Aby uruchomić plik wykonywalny, musisz dodać zmienną $ msbuild do &. To wykona zmienną.

# 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
działa również dla $dotNetVersion12.0 (vs 2013) i 14.0 (vs 2015) (jeśli zainstalowano oczywiście)
Julian

4
Nie działa dla VS 2017, który nie dodaje wartości pod HKLM:\software\Microsoft\MSBuild\ToolsVersionskluczem. Zamiast tego musisz pobrać katalog instalacyjny VS2017 HKLM:\SOFTWARE\WOW6432Node\Microsoft\VisualStud‌​io\SxS\VS7\15.0, a następnie dołączyć, MSBuild\15.0\Bin\MSBuild.exeaby uzyskać lokalizację pliku MSBuild EXE.
Ian Kemp,

30

W przypadku skryptów powłoki cmd w systemie Windows 7 używam następującego fragmentu w pliku wsadowym, aby znaleźć MSBuild.exe w .NET Framework wersja 4. Zakładam, że wersja 4 jest obecna, ale nie zakładam wersji podrzędnej. Nie jest to całkowicie ogólny cel, ale w przypadku szybkich skryptów pomocne może być:

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

Do moich zastosowań wychodzę z pliku wsadowego z błędem, jeśli to nie działa:

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 Po co set bb.build.msbuild.exe=? Czy jest to wymagane, czy tylko artefakt twojej konfiguracji?
Elisée

@ Elisée Ups, przepraszam, to literówka kopiuj / wklej. W moim środowisku nazywam zmienną bb.build.msbuild.exe, zaniedbałem naprawienie tego wystąpienia, kiedy wkleiłem do odpowiedzi. Naprawiono teraz, dziękuję za zwrócenie na to uwagi.
yoyo

26

Możesz użyć tego bardzo próbnego polecenia PowerShell, aby uzyskać MSBuildToolsPathz rejestru.

PowerShell (z rejestru)

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

Wynik

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

lub z systemu plików

PowerShell (z systemu plików)

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

Wynik

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
Najlepsza odpowiedź na ten temat.
Teoman shipahi

21

Instrukcje dotyczące znalezienia 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

Instrukcje dotyczące znalezienia 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

(Uwaga: powyższe instrukcje zostały nieco zmodyfikowane w stosunku do oficjalnych instrukcji Microsoft. W szczególności zawarłem -prereleaseflagę, aby umożliwić pobieranie instalacji Preview i RC oraz -products *wykrywanie instalacji Visual Studio Build Tools).


Zajęło to tylko dwa lata, ale w końcu w 2019 roku Microsoft wysłuchał i dał nam sposób na znalezienie tych ważnych plików wykonywalnych ! Jeśli masz zainstalowany vswhereprogram Visual Studio 2017 i / lub 2019, narzędzie można zapytać o lokalizację MSBuild i in. Ponieważ vswhere zawsze znajduje się w %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe , nie ma potrzeby ładowania początkowego i nie jest już wymagane twarde kodowanie ścieżki.

Magia to -findparametr dodany w wersji 2.6.2 . Możesz ustalić wersję, którą zainstalowałeś, uruchamiając vswherelub sprawdzając jej właściwości pliku. Jeśli masz starszą wersję, możesz po prostu pobrać najnowszą i zastąpić istniejącą %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe.

vswhere.exejest samodzielnym plikiem wykonywalnym, więc możesz go pobrać i uruchomić z dowolnego miejsca, w którym masz połączenie z Internetem. Oznacza to, że skrypty kompilacji mogą sprawdzić, czy środowisko, w którym działają, jest poprawnie skonfigurowane, aby wymienić tylko jedną opcję.


Istnieją już 3 odpowiedzi, które wspominają gdzie indziej, w tym Twój komentarz na ten temat pod jedną z nich. Dodanie tej odpowiedzi tylko pogarsza zupę odpowiedzi.
jpaugh

4
4 teraz. Uznałem tę odpowiedź za pomocną, podczas gdy nie uważałem, że inne odpowiedzi w innym miejscu są pomocne.
cowlinator

Warto zauważyć, że tylko dlatego, że VSWHERE mówi, że jest to plik msbuild.exe, nie oznacza to, że jeśli wpiszesz msbuildw wierszu polecenia (zwłaszcza w wierszu poleceń programu Visual Studio, jeśli go używasz), to ten zostanie wykorzystany. Aby zobaczyć, co przyzwyczaja się po wpisaniu msbuildw wierszu polecenia, wykonaj następujące czynności: where msbuild. Jeśli to nie raportuje tak samo jak VSWHERE mówi, że najnowsza i największa jest, to musisz zrobić pełną ścieżkę do tego, msbuild.exektórego chcesz użyć, lub wprowadzić odpowiednie zmiany w zmiennych PATH.
Jinlye,

Kolejne pytanie brzmi: jak znaleźć drogę do miejsca gdzie indziej ....
BJury,

17

@AllenSanborn ma świetną wersję PowerShell, ale niektórzy ludzie mają obowiązek używania tylko skryptów wsadowych do kompilacji.

To jest zastosowana wersja odpowiedzi @ 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

Dla programu Visual Studio 2017 / MSBuild 15 Aziz Atif (facet, który napisał Elmah ) napisał skrypt wsadowy

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
Uwaga: Ponieważ VS2017 / msbuild 15.x nie używa rejestru dla swoich ścieżek, vswhere jest alternatywą dla określenia ścieżki msbuild.
Roi Danton,

1
AzizAtif to także mężczyzna. Spójrz na to w przypadku kompilacji 15.1 - github.com/linqpadless/LinqPadless/blob/master/build.cmd
JJS

2
Również vswhere można zainstalować za pośrednictwem Chocolatey: chocolatey.org/packages/vswhere
cowlinator

6

Działa to dla Visual Studio 2015 i 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
W przypadku Narzędzi do budowania użyj vswhere -products *, jak określono w github.com/Microsoft/vswhere/wiki/Find-MSBuild .
TN.

W przypadku gdziekolwiek powinieneś znać ścieżkę, w której się znajduje. I oczywiście powinieneś mieć dostępną powłokę zasilania dla swojego systemu kompilacji. Tylko jedno pytanie: dlaczego amd64? Czy ma coś konkretnego do budowania?
Maxim

Pozytywne, ponieważ to rozwiązanie zasadniczo używa tylko klucza rejestru dla MSBuild 15, a nie biblioteki lub skryptu innej firmy. Z ciekawości, do czego odnosi się „SxS \ VS7”? Czy to pozostanie ważne w wersjach VS?
Lazlo

5

Lokalizacje rejestru

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

podaj lokalizację pliku wykonywalnego.

Ale jeśli potrzebujesz lokalizacji, w której chcesz zapisać rozszerzenia zadań, jest on włączony

%ProgramFiles%\MSBuild

4
Wiem, że jest dość stary - ale w każdym razie: w systemach x64 MSBuild-Folder znajduje się w ProgramFiles (x86)
Sascha

4

najprostszym sposobem może być otwarcie PowerShell i wejście

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

4

Jednowierszowy oparty na odpowiedzi @ dh_cgn :

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

Wybiera wszystkie istniejące ścieżki ścieżki np. C:\Program Files (x86)\Microsoft Visual Studio\*\*\MSBuild\*\bin\msbuild.exe.

Gwiazdy wieloznaczne to:

  • rok (2017)
  • edycja studia wizualnego (społeczność, profesjonalista, przedsiębiorstwo)
  • wersja narzędzia (15.0)

Pamiętaj, że to polecenie wybiera pierwszą ścieżkę pasującą do wyrażenia uporządkowanego według alfabetu. Aby go zawęzić, po prostu zastąp symbole wieloznaczne określonymi elementami, np. rok lub wersja narzędzi.


3

W systemie Windows 2003 i nowszych wpisz to polecenie w cmd:

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

Jeśli nic się nie pojawi, oznacza to, że środowisko .NET nie jest uwzględnione w ŚCIEŻCE systemu. MSBuild powinien znajdować się w folderze instalacyjnym .NET wraz z kompilatorami .NET (vbc.exe, csc.exe)


Ta odpowiedź niewiele wnosi do innych odpowiedzi. Jest mniej solidny niż ta odpowiedź
jpaugh

3

Począwszy od MSBuild 2017 (v15), MSBuild jest teraz instalowany w folderze w każdej wersji programu Visual Studio

Oto kilka przykładów znalezienia pliku MSBuild.exe na moim komputerze:

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)

Według poprzedniej odpowiedzi , 2017 czy w istocie przechowywać te informacje w rejestrze.
jpaugh

2

Aby pobrać ścieżkę do msbuild 15 (Visual Studio 2017) z partii z rejestru bez dodatkowych narzędzi:

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

Lepsze dostępne narzędzia:


1
uratowałeś mi życie
Hakan Fıstık

Istnieje już wersja tego programu PowerShell . Około 2017 roku, czy jest jakiś powód, aby unikać uczenia się PowerShell?
jpaugh

2
@jpaugh Nie każdy system kompilacji ma dostępny PowerShell.
Roi Danton

1

Nie pomyślałbyś, że jest tu wiele do dodania, ale być może nadszedł czas na jednolity sposób robienia tego we wszystkich wersjach. Połączyłem podejście kwerendy rejestru (VS2015 i nowsze) z użyciem vswhere (VS2017 i nowsze), aby wymyślić:

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

Istnieje wiele poprawnych odpowiedzi. Jednak tutaj One-Liner w PowerShell używam do określenia ścieżki MSBuild dla najnowszej wersji :

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

+1 Naprawdę przydatne! Ale w mojej odpowiedzi używam -last 1(zamiast -first 1w celu uzyskania najnowszej wersji), a także konkatenuję nazwę pliku (aby poprawnie uzyskać pełną ścieżkę, a nie tylko folder).
Mariano Desanze,

1

Ta metoda PowerShell pobiera ścieżkę do msBuild z wielu źródeł. Próbowanie w kolejności:

  1. Najpierw użyj vswhere (ponieważ Visual Studio wydaje się mieć bardziej aktualne wersje msBuild) np

    C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\MSBuild.exe
  2. Jeśli nie można znaleźć rejestru (wersja ramowa), np

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

Kod PowerShell:

Function GetMsBuildPath {

    Function GetMsBuildPathFromVswhere {
        # Based on https://github.com/microsoft/vswhere/wiki/Find-MSBuild/62adac8eb22431fa91d94e03503d76d48a74939c
        $vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
        $path = & $vswhere -latest -prerelease -products * -requires Microsoft.Component.MSBuild -property installationPath
        if ($path) {
            $tool = join-path $path 'MSBuild\Current\Bin\MSBuild.exe'
            if (test-path $tool) {
                return $tool
            }
            $tool = join-path $path 'MSBuild\15.0\Bin\MSBuild.exe'
            if (test-path $tool) {
                return $tool
            }
        }
    }

    Function GetMsBuildPathFromRegistry {
        # Based on Martin Brandl's answer: https://stackoverflow.com/a/57214958/146513
        $msBuildDir = Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\MSBuild\ToolsVersions\' |
            Get-ItemProperty -Name MSBuildToolsPath |
            Sort-Object PSChildName |
            Select-Object -ExpandProperty MSBuildToolsPath -last 1
        $msBuildPath = join-path $msBuildDir 'msbuild.exe'
        if (test-path $msBuildPath) {
            return $msBuildPath
        }
    }

    $msBuildPath = GetMsBuildPathFromVswhere
    if (-Not $msBuildPath) {
        $msBuildPath = GetMsBuildPathFromRegistry
    }
    return $msBuildPath
}

0

W przypadku programu Visual Studio 2017, nie znając dokładnej wersji, można użyć tego w skrypcie wsadowym:

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

Polecenie findstr ma zignorować niektóre pliki wykonywalne msbuild (w tym przykładzie amd64).


0

dodaj gałąź vswhere dla https://github.com/linqpadless/LinqPadless/blob/master/build.cmd , działa dobrze na moim komputerze, a gałąź vswhere działa na komputerze mojego partnera. Być może gałąź vswhere powinna przejść jako pierwsza kontrola.

@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

Pobierz najnowszą wersję MsBuild. Najlepszy sposób dla wszystkich typów instalacji msbuild dla różnych architektur procesorów (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

Jeśli chcesz skompilować projekt Delphi, spójrz na „BŁĄD MSB4040 W projekcie nie ma celu” przy użyciu msbuild + Delphi2009

Prawidłowa odpowiedź brzmi: „Istnieje plik wsadowy o nazwie rsvars.bat (wyszukaj go w folderze RAD Studio). Zadzwoń do niego przed wywołaniem MSBuild, a skonfiguruje on niezbędne zmienne środowiskowe. Upewnij się, że foldery są poprawne w rsvars .bat, jeśli masz kompilator w innej lokalizacji niż domyślna. "

Ten nietoperz nie tylko zaktualizuje zmienną środowiskową PATH do odpowiedniego folderu .NET z odpowiednią wersją MSBuild.exe, ale także zarejestruje inne niezbędne zmienne.


Ta odpowiedź nie jest związana z Delphi i nie jest bardziej niezawodna dla użytkowników Delphi.
Nashev,

2
Przepraszam za bycie zwięzłym. Miałem na myśli bardziej solidny, jak w, działa na więcej niż tylko Delphi. Może być łatwiejszy sposób, aby to zrobić w Delphi, ale OP nie zapytał o Delphi, a ten wątek zawiera około 18 odpowiedzi, których niewielu kiedykolwiek zobaczy. Jeśli ważne jest, aby inni to widzieli, zaleciłbym, aby utworzyć nowe pytanie specyficzne dla Delphi i odpowiedzieć sobie samemu. Gdybyśmy mieli do 6 lub mniej odpowiedzi, które obejmowały każdą wersję MSBuild, byłbym bardzo szczęśliwy
jpaugh
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.