MSBuildへのパス


186

.exeが実行されているマシンからプログラムでMSBuildへのパスを取得するにはどうすればよいですか?

環境から.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を起動して見てください。

コマンドラインからのクエリ(Nikolay Botevごと)

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をインストールし、開発者コマンドプロンプトを起動しました。MSBuildのバージョンは15. +ですが、このバージョンはレジストリに表示されません。Dev Cmdプロンプトが使用しているのと同じMSBuildにアクセスするにはどうすればよいですか?
SuperJMN 2017年

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

2
VS2017をそこにインストールした場合にのみ、15.0ツールセットのMsBuildToolsPathのレジストリに単一のエントリポイントが見つかりませんでした
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はVisual Studio 2017 / msbuild 15.xインスタンスのパスを決定するためのプロジェクトをGitHubで提供しています。これは、ビルドソフトウェア/スクリプトで使用できる単一の実行可能ファイルです。
Roi Danton 2017

140

MSBuild.exeのパスをコマンドラインに出力することもできます。

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

1
Windows Phoneアプリをビルドする場合は、32ビットのmsbuildが必要です。レジストリを照会すると、64ビットマシンでは64ビットのmsbuildしか得られません。
Victor Ionescu 14

2
@VictorIonescu:/reg:32または/reg:64その両方のbitnessess cmd(または実行中のプロセス)を使用して、そのパスを明示的に取得できます。
Simon Buchan

これは古い(4.0)の場所にあなたのパスを与えるだろう-あなたは、おそらく実際に他の場所で参照されたい1 stackoverflow.com/questions/32007871/...
JonnyRaa

私の場合、それは下でしたComputer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\MSBuild\ToolsVersions\4.0\MSBuildToolsPath
Sen Jacob

32

MSBuild for .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
以下のためにも働く$dotNetVersion(もちろんインストールされている場合)(2015対)(2013 VS)12.0と14.0
ジュリアン

4
HKLM:\software\Microsoft\MSBuild\ToolsVersionsキーの下に値を追加しないVS 2017では機能しません。代わりに、VS2017インストールディレクトリをから取得し、MSBuild EXEの場所を取得するためにHKLM:\SOFTWARE\WOW6432Node\Microsoft\VisualStud‌​io\SxS\VS7\15.0追加する必要があり MSBuild\15.0\Bin\MSBuild.exeます。
Ian Kemp

30

Windows 7のcmdシェルスクリプトの場合、バッチファイルで次のフラグメントを使用して、.NET Frameworkバージョン4でMSBuild.exeを見つけます。バージョン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

@Eliséeおっと、申し訳ありませんが、それはコピー/貼り付けのタイプミスです。私の環境では、変数bb.build.msbuild.exeを呼び出しますが、回答に貼り付けたときに、そのインスタンスを修正することを怠っていました。修正しました。指摘していただきありがとうございます。
ヨーヨー

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
このトピックに関する最良の答え。
Teoman Shipahi 2017

19

MSBuildを見つける手順

  • パワーシェル: &"${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を見つけるための手順

  • パワーシェル: &"${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プレビューとRCのインストールをピックアップできるようにするフラグと、-products *Visual Studio Build Toolsのインストールを検出するためのフラグを含めました。)


わずか2年しかかかりませんでしたが、ついに2019年に、マイクロソフトはこれらの重要な実行可能ファイルを見つける方法を聞いてくれました。Visual Studio 2017または2019がインストールされている場合、vswhereユーティリティはMSBuildなどの場所を照会できます。vswhere は常ににある ため%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe、ブートストラップやパスのハードコーディングは必要ありません。

魔法はバージョン2.6.2-find追加されたパラメーターです。インストールしたバージョンをvswhere確認するには、を実行するか、ファイルのプロパティを確認します。古いバージョンを使用している場合は、最新のものダウンロードして、既存のを上書きできます%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe

vswhere.exeスタンドアロンの実行可能ファイルなので、インターネットに接続していればどこからでもダウンロードして実行できます。つまり、ビルドスクリプトは、スクリプトを実行している環境が正しく設定されているかどうかをチェックして、1つのオプションを指定できます。


vswhereについては、すでに3つの回答があり、そのうちの1つにその影響についてのコメントが含まれています。この回答を追加すると、回答がさらに悪化します。
jpaugh

4
4です。この回答は役に立ちましたが、他のvswhereの回答は役に立ちませんでした。
カウリネーター

VSWHEREが使用するmsbuild.exeであると言っているからといってmsbuild、コマンドライン(特にそれを使用している場合はVisual Studioコマンドライン)で入力しても、それが使用されるということにはなりません。msbuildコマンドラインで入力した場合に何が使用されるかを確認するには、次のようにしますwhere msbuild。それがVSWHEREが最新で最も優れていると言っているのと同じではない場合は、msbuild.exe使用するへのフルパスを実行するか、PATH変数を調整して調整する必要があります。
Jinlye

次の質問....どのようにvswhereへのパスを見つけるんですので
BJury

17

@AllenSanbornには優れたpowershellバージョンがありますが、ビルドにバッチスクリプトのみを使用する必要がある人もいます。

これは、@ 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はパスにレジストリを使用しないため、vswhereはmsbuildパスを決定する代替手段です。
Roi Danton 2017

1
また、AzizAtifは男性です。15.1ビルド-github.com/linqpadless/LinqPadless/blob/master/build.cmd
JJS

2
また、vswhereはChocolateyを介してインストールできます:chocolatey.org/packages/vswhere
カウリネーター2018年

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で指定されているを使用します。
TN。

vswhereの場合は、それが配置されているパスを知っている必要があります。そしてもちろん、ビルドシステムで利用できるpower-shellが必要です。ただ1つの質問:なぜ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-Systemsでは、MSBuild-FolderはProgramFiles(x86)にあります
Sascha

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フレームワークがシステムのPATHに含まれていないことを意味します。MSBuildは、.NETコンパイラ(vbc.exe、csc.exe)とともに.NETインストールフォルダにある必要があります。


この答えは、他の答えに比べてそれほど多くはありません。この回答
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
あなたは私の命を救った
HakanFıstık18年

これのPowerShellバージョンは既に存在します。2017年頃、Powershellの学習を避ける理由はありますか?
jpaugh

2
@jpaughすべてのビルドシステムでPowerShellを使用できるわけではありません。
Roi Danton 2018年

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

正解はたくさんあります。ただし、ここでは、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

このPowerShellメソッドは、複数のソースから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

https://github.com/linqpadless/LinqPadless/blob/master/build.cmdの vswhereブランチを追加すると、私のコンピューターでは問題なく機能し、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プロジェクトをコンパイルする場合は、msbuild + Delphi2009を使用するときに「エラーMSB4040プロジェクトにターゲットがありません」を参照してください。

正解は、「rsvars.batというバッチファイルがあります(RAD Studioフォルダーで検索してください)呼び出す前に呼び出してください。必要な環境変数がセットアップされます。rsvarsでフォルダーが正しいことを確認してくださいコンパイラがデフォルトとは異なる場所にある場合は.bat。」

このバットは、PATH環境変数を適切なMSBuild.exeバージョンで適切な.NETフォルダーに更新するだけでなく、他の必要な変数も登録します。


その答えはDelphi関連ではなく、Delphiユーザーにとってより堅牢ではありません。
ナシェフ2018年

2
簡潔になって申し訳ありません。私はより堅牢で、Delphiだけでは機能しないことを意味しました。Delphiでそれを行う簡単な方法があるかもしれませんが、OPはDelphiについて尋ねませんでした。他の人がこれを見ることが重要である場合は、Delphiに固有の新しい質問を作成し、自己回答することをお勧めします。MSBuildのすべてのバージョンを網羅した6以下の回答になったら、私はとても幸せです
-jpaugh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.