Шлях до MSBuild


186

Як я можу програмно отримати шлях до MSBuild з машини, де працює мій .exe?

Я можу отримати версію .NET із середовища, але чи є спосіб отримати правильну папку для версії .NET?

Відповіді:


141

Оглянувши реєстр, схоже

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

може бути тим, за чим ви хочете; запустити regedit.exe і подивитися.

Запит через командний рядок (за Миколою Ботевим )

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

Запит через PowerShell (за MovGP0 )

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

5
Я встановив Visual Studio 2017 RC і запустив командний рядок Developer, версія MSBuild становить 15. +, але ця версія не відображається в реєстрі. Як отримати доступ до того ж MSBuild, який використовує Dev Cmd Prompt?
SuperJMN

6
MSBuild 15 знаходиться за адресою `C: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Enterprise \ MSBuild \ 15.0 \ Bin \ amd64`
nZeus

2
Тільки якщо ви встановили VS2017 там, я не зміг знайти жодної точки входу в реєстрі для MsBuildToolsPath для набору інструментів 15.0
Paciv

8
docs.microsoft.com/en-us/visualstudio/msbuild/… "MSBuild тепер встановлений у папці під кожною версією Visual Studio. Наприклад, C: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Enterprise \ MSBuild "та" Значення ToolsVersion більше не встановлені в реєстрі "
Hulvej

2
@ORMapper Microsoft пропонує проект на GitHub для визначення шляхів екземплярів Visual Studio 2017 / msbuild 15.x. Це єдиний виконуваний файл, який може бути використаний вашим програмним забезпеченням / сценаріями для побудови.
Рой Дантон

140

Ви також можете надрукувати шлях MSBuild.exe до командного рядка:

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

1
Зверніть увагу, що якщо ви хочете створити додаток для телефону для Windows, то для створення потрібні 32-бітний msbuild. Запит на реєстр дає лише 64-бітну збірку ms на 64-бітної машині.
Віктор Іонеску

2
@VictorIonescu: Ви можете використовувати /reg:32або /reg:64в обох бітнесах cmd(або будь-який процес, який ви виконуєте), щоб явно пройти цей шлях.
Саймон Бучан

це дасть вам шлях до старого (4.0) місця - той , який ви , ймовірно , хочете насправді в іншому місці побачити stackoverflow.com/questions/32007871 / ...
JonnyRaa

У моєму випадку це було підComputer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\MSBuild\ToolsVersions\4.0\MSBuildToolsPath
Сена Якова

32

Якщо ви хочете використовувати MSBuild для .Net 4, то ви можете використовувати наступну команду PowerShell, щоб отримати шлях виконуваного файлу. Якщо ви хочете версії 2.0 або 3.5, просто змініть змінну $ dotNetVersion.

Щоб запустити виконуваний файл, вам потрібно додати змінну $ msbuild за допомогою &. Це виконає змінну.

# 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
працює також для $dotNetVersion12.0 (проти 2013) та 14.0 (проти 2015) (якщо встановлено, звичайно)
Джуліан

4
Не працює для VS 2017, що не додає значення під HKLM:\software\Microsoft\MSBuild\ToolsVersionsключем. Замість цього вам потрібно отримати установку VS2017 з dir HKLM:\SOFTWARE\WOW6432Node\Microsoft\VisualStud‌​io\SxS\VS7\15.0, а потім додати, MSBuild\15.0\Bin\MSBuild.exeщоб отримати місце MSBuild EXE.
Ян Кемп

30

Для сценаріїв оболонки cmd в Windows 7 я використовую наступний фрагмент у своєму пакетному файлі, щоб знайти MSBuild.exe у версії 4.NET Framework 4. Я припускаю, що версія 4 присутня, але не передбачає, що її під-версія. Це не зовсім загальне призначення, але для швидких сценаріїв це може бути корисно:

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

У своїх цілях я виходжу з пакетного файлу з помилкою, якщо це не спрацювало:

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 Що set bb.build.msbuild.exe=для чого? Це потрібно або просто артефакт вашої установки?
Елісей

@ Elisée На жаль, це помилка копіювання / вставки. У своєму оточенні я викликаю змінну bb.build.msbuild.exe, я знехтував виправити цей примірник, коли я вставив відповідь. Виправлено зараз, дякую, що вказав на це.
yoyo

26

Ви можете скористатися цією пробною командою PowerShell, щоб отримати її MSBuildToolsPathз реєстру.

PowerShell (з реєстру)

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

Вихідні дані

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

або з файлової системи

PowerShell (з файлової системи)

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

Вихідні дані

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
Найкраща відповідь на цю тему.
Теоман шипахі

21

Інструкції з пошуку 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

Інструкції з пошуку 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

(Зверніть увагу, що наведені вище інструкції трохи змінені з офіційних інструкцій Microsoft. Зокрема, я включив -prereleaseпрапор, щоб дозволити підбирати установки Preview і RC, а також -products *виявити установки Visual Studio Build Tools.)


Минуло лише два роки, але нарешті у 2019 році Microsoft вислухала та дала нам спосіб знайти ці життєво важливі виконувані файли ! Якщо у вас встановлено Visual Studio 2017 та / або 2019, vswhereутиліту можна запитати про місцезнаходження MSBuild та ін. Оскільки vswhere завжди розміщено в %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe , більше не потрібно завантажувати завантаження і не потрібно жорстке кодування шляху.

Магія - це -findпараметр, доданий у версії 2.6.2 . Ви можете встановити встановлену версію, запустивши vswhereабо перевіривши її властивості файлу. Якщо у вас старіша версія, ви можете просто завантажити останню версію та перезаписати існуючу %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe.

vswhere.exeє автономним виконуваним файлом, тому ви можете завантажити та запустити його з будь-якого місця, де у вас є інтернет. Це означає, що ваші сценарії побудови можуть перевірити, чи середовище, на якому вони працюють, налаштовано правильно, назвати один варіант.


Вже є 3 відповіді, в яких згадуються всюди, включаючи ваш коментар до цього ефекту під одним із них. Додавання цієї відповіді просто погіршує відповідь.
jpaugh

4
4 зараз. Я вважав цю відповідь корисною, тоді як я не вважав, що інші відповіді корисні.
ковбасник

Варто зауважити, що лише тому, що VSWHERE каже, що використовується msbuild.exe, це не означає, що якщо ви введете msbuildкомандний рядок (особливо командний рядок Visual Studio, якщо це використовуєте), це той, до якого звикнути. Для того, щоб побачити , що звикає , якщо ви вводите msbuildв командному рядку, зробіть наступне: where msbuild. Якщо це не так, як VSWHERE каже, що останнє і найбільше, то або вам доведеться провести повний шлях до того, що msbuild.exeви хочете використовувати, або внести корективи у свої змінні PATH відповідно.
Jinlye

Отож, наступне питання - як ти знайдеш шлях до кудись…
BJury

17

@AllenSanborn має відмінну версію для оболонок, але деякі люди мають вимогу використовувати лише пакетні сценарії для збірок.

Це застосована версія відповідей @ 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

Для Visual Studio 2017 / MSBuild 15 Aziz Atif (хлопець, який написав Elmah ) написав пакетний сценарій

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
Примітка: Оскільки VS2017 / msbuild 15.x не використовує реєстр для своїх шляхів, в іншому випадку це альтернатива для визначення шляху msbuild.
Рой Дантон

1
Також AzizAtif - це людина. Візьміть участь у цьому для 15,1 версій
JJS

2
Крім того, vswhere можна встановити через Chocolatey: chocolatey.org/packages/vswhere
cowlinator

6

Це працює для Visual Studio 2015 та 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
Для інструментів побудови використовуйте vswhere -products *, як зазначено в github.com/Microsoft/vswhere/wiki/Find-MSBuild .
ТН.

Для місця, де ви повинні знати шлях, де він знаходиться. І звичайно, у вас повинна бути доступна оболонка з живленням для вашої системи складання. Лише одне питання: чому amd64? Чи є в ньому щось конкретне для будівництва?
Максим

Оновлено, оскільки це рішення по суті просто використовує ключ реєстру для MSBuild 15, а не сторонню бібліотеку чи сценарій. Що з цікавості стосується "SxS \ VS7"? Чи буде це чинним у всіх версіях VS?
Лазло

5

Розташування реєстру

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

дайте місце для виконуваного файлу.

Але якщо вам потрібно місце, де зберігати розширення Завдання, він увімкнено

%ProgramFiles%\MSBuild

4
Я досить старий, я знаю - але все одно: на x64-Системах MSBuild-Folder знаходиться в ProgramFiles (x86)
Саша,

4

Найпростішим способом може бути відкриття PowerShell та вхід

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

4

Однолінійний базується на відповіді @ dh_cgn :

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

Він вибирає всі існуючі шляхи, наприклад, наприклад. C:\Program Files (x86)\Microsoft Visual Studio\*\*\MSBuild\*\bin\msbuild.exe.

Зіркові символи:

  • рік (2017)
  • візуальне студійне видання (громада, професіонал, підприємство)
  • версія інструментів (15.0)

Майте на увазі, що ця команда - це вибір першого шляху, який відповідає вираженню, упорядкованому за алфавітом. Щоб звузити його, просто замініть підстановку на конкретні елементи, наприклад. рік або версія інструментів.


3

У Windows 2003 та новіших версіях введіть цю команду в cmd:

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

Якщо нічого не з'являється, це означає, що .NET Framework не включений в систему PATH. MSBuild повинен знаходитись у папці інсталяції .NET разом із компіляторами .NET (vbc.exe, csc.exe)


Ця відповідь не надто відрізняється від інших відповідей. Це менш надійно, ніж ця відповідь
jpaugh

3

Починаючи з MSBuild 2017 (v15), MSBuild тепер встановлюється у папці під кожною версією Visual Studio

Ось кілька прикладів того, де MSBuild.exe знаходиться на моїй машині:

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)

У відповідності з попереднім відповіддю 2017 робить фактично зберігати цю інформацію в реєстрі.
jpaugh

2

Щоб отримати шлях з msbuild 15 (Visual Studio 2017) з партією з реєстру без додаткових інструментів:

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

Кращі доступні інструменти:


1
ти врятував мені життя
Hakan Fıstık

Версія PowerShell для цього вже є . Приблизно 2017, чи є якісь причини уникати навчання Пауершелу?
jpaugh

2
@jpaugh Не кожна система складання доступна PowerShell.
Рой Дантон

1

Ви б не думали, що тут можна багато чого додати, але, можливо, настав час для єдиного способу зробити це для всіх версій. Я поєднав підхід до запиту до реєстру (VS2015 і нижче) з використанням vswhere (VS2017 і вище), щоб придумати це:

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

Є багато правильних відповідей. Однак ось One-Liner в PowerShell я використовую для визначення шляху MSBuild для останньої версії :

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

+1 Дійсно корисно! Але у своїй відповіді я використовую -last 1(замість -first 1того, щоб отримати останню версію), а також об'єднати ім'я файлу (щоб правильно отримати повний шлях і не тільки папку).
Маріано Дезанзе

1

Цей метод powerhell отримує шлях до msBuild з декількох джерел. Спроба в порядку:

  1. Перше використання vswhere (оскільки, здається, Visual Studio має більш сучасні версії msBuild), наприклад

    C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\MSBuild.exe
  2. Якщо не знайдено спробу реєстру (рамкова версія), наприклад

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

Код 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

Для Visual Studio 2017, не знаючи точного видання, ви можете використовувати це в пакетному сценарії:

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 - ігнорувати певні виконувані файли msbuild (у цьому прикладі amd64).


0

додати відділення vswhere для https://github.com/linqpadless/LinqPadless/blob/master/build.cmd , відмінно працює на моєму комп’ютері, а відділення vswhere працює на комп’ютері мого партнера. Можливо, відділення vswhere має рухатися вперед як перша перевірка.

@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. Найкращий спосіб для всіх типів установки msbuild, для різної архітектури процесора (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

Якщо ви хочете скласти проект Delphi, подивіться "ПОМИЛКА MSB4040 Немає цілі в проекті", коли використовуєте msbuild + Delphi2009

Правильна відповідь там сказана: "Є пакетний файл під назвою rsvars.bat (шукайте його в папці RAD Studio). Зателефонуйте, перш ніж викликати MSBuild, і він встановить необхідні змінні середовища. Переконайтеся, що папки є правильними у rsvars .bat, якщо у вас компілятор в іншому місці за замовчуванням. "

Цей кажан не тільки оновить змінну середовища PATH до належної .NET папки з належною версією MSBuild.exe, але й реєструє інші необхідні змінні.


Ця відповідь не стосується Delphi та не є більш надійною для користувачів Delphi.
Нашев

2
Вибачте за те, що ви були терпкими. Я мав на увазі більш надійний, як в, працює для більш ніж просто Delphi. Це може бути простіший спосіб зробити це в Delphi, але ОП не запитував про Delphi, і ця тема містить 18 відповідей, які мало хто коли-небудь побачить. Якщо вам важливо, щоб інші бачили це, я рекомендую вам створити нове питання, характерне для Delphi, та самовідповісти. Якщо ми отримаємо 6 або менше відповідей, які охоплювали кожну версію MSBuild, я був би дуже радий
jpaugh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.