जवाबों:
रजिस्ट्री के आसपास, यह लग रहा है
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
dir HKLM:\SOFTWARE\Microsoft\MSBuild\ToolsVersions\
आप MSBuild.exe के कमांड लाइन के पथ को प्रिंट भी कर सकते हैं:
reg.exe query "HKLM\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0" /v MSBuildToolsPath
/reg:32
या /reg:64
दोनों bitnessess पर cmd
(या जो भी प्रक्रिया कर आप चल रहे हैं) स्पष्ट रूप से उस मार्ग मिलता है।
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\MSBuild\ToolsVersions\4.0\MSBuildToolsPath
यदि आप .net 4 के लिए MSBuild का उपयोग करना चाहते हैं, तो आप निष्पादन योग्य पथ प्राप्त करने के लिए निम्न 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
$dotNetVersion
12.0 (बनाम 2013) और 14.0 (बनाम 2015) के लिए भी काम करता है (यदि पाठ्यक्रम स्थापित किया गया है)
HKLM:\software\Microsoft\MSBuild\ToolsVersions
कुंजी के तहत एक मूल्य नहीं जोड़ता है । इसके बजाय आपको वीएस २०१ the को डीआईआर से स्थापित करने की आवश्यकता है HKLM:\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\SxS\VS7\15.0
, फिर MSBuild\15.0\Bin\MSBuild.exe
MSBuild EXE स्थान प्राप्त करने के लिए अपील करें ।
विंडोज 7 में cmd शेल स्क्रिप्टिंग के लिए, मैं .NET फ्रेमवर्क संस्करण 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
set bb.build.msbuild.exe=
लिए? क्या यह आवश्यक है या आपके सेटअप की सिर्फ एक कलाकृति है?
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
या फाइल सिस्टम से
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
MSBuild खोजने के लिए निर्देश :
&"${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" -latest -prerelease -products * -requires Microsoft.Component.MSBuild -find MSBuild\**\Bin\MSBuild.exe
"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -prerelease -products * -requires Microsoft.Component.MSBuild -find MSBuild\**\Bin\MSBuild.exe
&"${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
"%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 स्थापनाओं का पता लगाने के लिए।)
इसमें केवल दो साल का समय लगा लेकिन आखिरकार 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
एक स्टैंडअलोन निष्पादन योग्य है, इसलिए आप इसे कहीं से भी डाउनलोड कर सकते हैं और चला सकते हैं। इसका मतलब है कि आपकी बिल्ड स्क्रिप्ट यह जांच सकती है कि वे जिस पर्यावरण पर चल रहे हैं, वह एक विकल्प के नाम पर सही तरीके से सेटअप है।
msbuild
कमांड लाइन पर टाइप करते हैं (विशेष रूप से विजुअल स्टूडियो कमांड लाइन यदि वह उपयोग कर रहा है), तो वह वह है जिसका उपयोग किया जाएगा। क्या इस्तेमाल किया जाता है देखने के लिए अगर आप टाइप msbuild
आदेश पंक्ति पर, ऐसा करते हैं: where msbuild
। यदि वह वही रिपोर्ट नहीं कर रहा है जैसा कि VSWHERE कहता है कि नवीनतम और सबसे बड़ा है, तो या तो आपको उस पूर्ण पथ msbuild.exe
का उपयोग करना होगा जिसे आप उपयोग करना चाहते हैं, या अपने पैथ चर के अनुरूप समायोजन करें।
@AllenSanborn का एक बहुत अच्छा संस्करण है, लेकिन कुछ लोगों को बिल्ड के लिए केवल बैच स्क्रिप्ट का उपयोग करने की आवश्यकता होती है।
यह @ FREE8106 के उत्तर का एक लागू संस्करण है।
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
विजुअल स्टूडियो 2017 / MSBuild 15 के लिए, अजीज आतिफ ( एलमाह लिखने वाले व्यक्ति ) ने एक बैच स्क्रिप्ट लिखी थी
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
यह विजुअल स्टूडियो 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
}
vswhere -products *
, github.com/Microsoft/vswhere/wiki/Find-MSBuild में निर्दिष्ट अनुसार उपयोग करें ।
रजिस्ट्री स्थानों
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\2.0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\3.5
निष्पादन योग्य के लिए स्थान दें।
लेकिन अगर आपको उस स्थान की आवश्यकता है जहां टास्क एक्सटेंशन को सहेजना है, तो यह चालू है
%ProgramFiles%\MSBuild
@ 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
।
वाइल्डकार्ड सितारे हैं:
विदित हो कि यह कमांड उस पहले पथ का चयन कर रहा है जो वर्णमाला द्वारा आदेशित अभिव्यक्ति से मेल खाता है। इसे संकीर्ण करने के लिए बस वाइल्डकार्ड को विशिष्ट तत्वों जैसे प्रतिस्थापित करें। वर्ष या उपकरण संस्करण।
Windows 2003 और बाद में, cmd में यह कमांड टाइप करें:
cmd> where MSBuild
Sample result: C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe
यदि कुछ भी नहीं दिखाई देता है, तो इसका मतलब है कि .NET फ्रेमवर्क सिस्टम PATH में शामिल नहीं है। MSBuild .NET संस्थापन फ़ोल्डर में .NET कंपाइलर (vbc.exe, csc.exe) के साथ होना चाहिए
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)
रजिस्ट्री w / o अतिरिक्त टूल से बैच के साथ msbuild 15 (विजुअल स्टूडियो 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
बेहतर उपलब्ध उपकरण:
आपको नहीं लगता कि यहां जोड़ने के लिए बहुत कुछ है, लेकिन शायद यह सभी संस्करणों में ऐसा करने के एकीकृत तरीके के लिए समय है। मैंने आपके साथ आने के लिए vswhere (VS2017 और ऊपर) के उपयोग के साथ रजिस्ट्री-क्वेरी दृष्टिकोण (VS2015 और नीचे) संयुक्त किया है :
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
}
कई सही जवाब हैं। हालाँकि, यहाँ PowerShell में वन-लाइनर मैं सबसे हाल के संस्करण के लिए MSBuild पथ निर्धारित करने के लिए उपयोग करता हूँ :
Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\MSBuild\ToolsVersions\' |
Get-ItemProperty -Name MSBuildToolsPath |
Sort-Object PSChildName |
Select-Object -ExpandProperty MSBuildToolsPath -first 1
-last 1
( -first 1
नवीनतम संस्करण को प्राप्त करने के लिए) का उपयोग करता हूं और फ़ाइल नाम को भी संक्षिप्त करता हूं ( ठीक से पूर्ण पथ प्राप्त करने के लिए और न केवल फ़ोल्डर)।
यह पॉवरशेल विधि कई स्रोतों से msBuild के लिए रास्ता पाती है। क्रम में कोशिश कर रहा है:
पहले vswhere (क्योंकि Visual Studio msBuild के अद्यतित संस्करणों में अधिक लगता है) का उपयोग कर रहा है। उदा
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\MSBuild.exe
अगर रजिस्ट्री (फ्रेमवर्क संस्करण) जैसे की कोशिश करते हुए नहीं मिला
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe
पॉवर्सशेल कोड:
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
}
विज़ुअल स्टूडियो 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)
खोज आदेश कुछ msbuild निष्पादनों (इस उदाहरण में amd64) को अनदेखा करने के लिए है।
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
यदि आप साहसी हैं, तो आप https://github.com/Microsoft/msbuild/releases/ पर अब GitHub से स्रोत कोड और नवीनतम रिलीज का MsBuild प्राप्त कर सकते हैं।
MsBuild का नवीनतम संस्करण प्राप्त करें। विभिन्न प्रोसेसर आर्किटेक्चर (पॉवर शेल) के लिए सभी तरह के msbuild इंस्टॉलेशन के लिए सबसे अच्छा तरीका:
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;
}
यदि आप डेल्फी परियोजना को संकलित करना चाहते हैं, तो msbuild + Delphi2009 का उपयोग करते समय "ERROR MSB4040 परियोजना में कोई लक्ष्य नहीं है" को देखें।
सही उत्तर में कहा गया है: " rsvars.bat नामक एक बैच फ़ाइल है ( स्टूडियो फ़ोल्डर में इसके लिए खोज) । MSBuild को कॉल करने से पहले कॉल करें, और यह आवश्यक वातावरण चर सेट करेगा। सुनिश्चित करें कि फ़ोल्डर rsvars में सही हैं। .bat यदि आपके पास डिफ़ॉल्ट के लिए एक अलग स्थान पर संकलक है। "
यह बल्ला न केवल उचित MSBuild.exe संस्करण के साथ उचित .NET फ़ोल्डर में PATH पर्यावरण चर को अद्यतन करेगा, बल्कि अन्य चर चर भी पंजीकृत करता है।