TL;DR
- 複数のバージョンのVisual Studioをインストールしている環境下において、使用したいバージョンのコマンドラインビルドに使用するMSBuild.exeを探すスクリプトを作成した
(2019.03.10追記)
下記バージョンのMSBuild.exeのパスを追加
– Visual Studio 2013
– Visual Studio 2017 Professional
参照URL
概要
かなりニッチな状況ですが、
– Visual Studioで作成したツール類をコマンドラインからビルドしたい
– Visual Studioのバージョンは特に指定しないけど、特定バージョン以降じゃないとビルドが通らない
– ビルドする環境が32bit/64bit混在
という状況になった際に、Power Shellスクリプトで解決したので、まとめておきます。
解説
スクリプト
スクリプトは、下記よりダウンロードできます。
https://github.com/rot-z/MSBuildSearch
スクリプト起動用のバッチ
Power Shellはデフォルト設定だと実行が禁止されていますので、権限指定してバッチファイルから指定します。
@echo off cd /d %~dp0 powershell -NoProfile -ExecutionPolicy Unrestricted .\MSBuilsSearch_impl.ps1 pause
MSBuils.exeを探すPower Shellスクリプト
単純に、あらかじめリストで持っておいた”Program Files”フォルダ配下のパスにMSBuild.exeを探しています。
“Program Files”フォルダはOSのアーキテクチャによって”Program Files”(32bit), “Program Files (x86)”(64bit)と名前が異なりますので、そのあたりは勝手に解決しています。
# ============================================================================= # search MSBuild.exe # ============================================================================= # folder paths of Visual Studio $MSBUILD_12_PATH = "MSBuild`\12.0`\Bin" # Visual Studio 2013 $MSBUILD_14_PATH = "MSBuild`\14.0`\Bin" # Visual Studio 2015 $MSBUILD_15_COMMUNITY_PATH = "Microsoft Visual Studio`\2017`\Community`\MSBuild`\15.0`\Bin" # Visual Studio 2017 Community $MSBUILD_15_PROFESSIONAL_PATH = "Microsoft Visual Studio`\2017`\Professional`\MSBuild`\15.0`\Bin" # Visual Studio 2017 Professional # target paths for MSBuild # sort by priority [array]$SEARCH_PATHS = @( $MSBUILD_14_PATH, $MSBUILD_15_COMMUNITY_PATH, $MSBUILD_15_PROFESSIONAL_PATH, $MSBUILD_12_PATH ) # get full path of "Program Files" folder from OS archtechture $arch = (Get-WmiObject win32_operatingsystem | Select-Object osarchitecture) $archName = $arch.osarchitecture $programFilesDir = "" if ($archName.StartsWith("64")) { $programFilesDir = ${env:ProgramFiles(x86)} } else { $programFilesDir = ${env:ProgramFiles} } # search MSBuild.exe $msbuildPath = "" foreach($p in $SEARCH_PATHS) { # is folder exists? $targetPath = Join-Path $programFilesDir $p if (!(Test-Path $targetPath)) { continue } # select the most shortest (shallowest) path $results = (Get-ChildItem $targetPath -Include MSBuild.exe -Recurse).FullName | Sort-Object -Property Length if ($results.Length -gt 0) { $msbuildPath = $results[0] Write-host $msbuildPath } }
無償版のパスしか埋めてないのは、手元の環境で調査したからです。
適宜自分の環境に合わせてパスの追加を行ってください。