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

पावरशेल के माध्यम से क्वेरी ( मूवमेंट के अनुसार )

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

5
मैंने विजुअल स्टूडियो 2017 आरसी स्थापित किया है और डेवलपर कमांड प्रॉम्प्ट शुरू करते हुए, MSBuild संस्करण 15. + है, लेकिन यह संस्करण रजिस्ट्री में दिखाई नहीं देता है। मैं उसी MSBuild तक कैसे पहुँच सकता हूँ जो देव Cmd प्रॉम्प्ट का उपयोग कर रहा है?
सुपर जेएमएन 12

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 \ Enterprise \। MSBuild "और" ToolsVersion मान अब रजिस्ट्री में सेट नहीं हैं "
हुलवेज

2
@ORMapper Microsoft Visual Studio 2017 / msbuild 15.x इंस्टेंस के पथ के निर्धारण के लिए GitHub पर एक परियोजना प्रदान करता है । यह एक एकल निष्पादन योग्य है जिसका उपयोग आपके बिल्ड सॉफ़्टवेयर / स्क्रिप्ट द्वारा किया जा सकता है।
रॉय डेंटन

140

आप MSBuild.exe के कमांड लाइन के पथ को प्रिंट भी कर सकते हैं:

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

1
कृपया ध्यान दें कि यदि आप एक विंडोज़ फोन ऐप बनाना चाहते हैं, जिसमें 32 बिट्स एमएसबिल्ट की जरूरत है। रजिस्ट्री को छोड़ना 64 बिट मशीन पर केवल 64 बिट एमएसबिल्ट देता है।
विक्टर Ionescu

2
@VictorIonescu: आप उपयोग कर सकते हैं /reg:32या /reg:64दोनों bitnessess पर cmd(या जो भी प्रक्रिया कर आप चल रहे हैं) स्पष्ट रूप से उस मार्ग मिलता है।
साइमन बुकान

एक तो आप शायद चाहते हैं वास्तव में कहीं और देखने जाता है - यह आप एक पुराने (4.0) उस स्थान का पथ दे देंगे stackoverflow.com/questions/32007871/...
JonnyRaa

मेरे मामले में यह अंडर थाComputer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\MSBuild\ToolsVersions\4.0\MSBuildToolsPath
सेन जैकब

32

यदि आप .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

2
$dotNetVersion12.0 (बनाम 2013) और 14.0 (बनाम 2015) के लिए भी काम करता है (यदि पाठ्यक्रम स्थापित किया गया है)
जूलियन

4
वीएस 2017 के लिए काम नहीं करता है, जो HKLM:\software\Microsoft\MSBuild\ToolsVersionsकुंजी के तहत एक मूल्य नहीं जोड़ता है । इसके बजाय आपको वीएस २०१ the को डीआईआर से स्थापित करने की आवश्यकता है HKLM:\SOFTWARE\WOW6432Node\Microsoft\VisualStud‌​io\SxS\VS7\15.0, फिर MSBuild\15.0\Bin\MSBuild.exeMSBuild EXE स्थान प्राप्त करने के लिए अपील करें ।
इयान केम्प

30

विंडोज 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=लिए? क्या यह आवश्यक है या आपके सेटअप की सिर्फ एक कलाकृति है?
एलिसा

@ Elisée उफ़, क्षमा करें, यह एक कॉपी / पेस्ट टाइपो है। मेरे वातावरण में मैं चर bb.build.msbuild.exe कहता हूं, जब मैंने उत्तर में पेस्ट किया तो मैंने उस उदाहरण को ठीक करने की उपेक्षा की। अब ठीक है, यह इंगित करने के लिए धन्यवाद।
योयो

26

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
इस विषय पर सबसे अच्छा जवाब।
तेमन शिपाही

19

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

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
  • अध्यक्ष एवं प्रबंध निदेशक: "%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एक स्टैंडअलोन निष्पादन योग्य है, इसलिए आप इसे कहीं से भी डाउनलोड कर सकते हैं और चला सकते हैं। इसका मतलब है कि आपकी बिल्ड स्क्रिप्ट यह जांच सकती है कि वे जिस पर्यावरण पर चल रहे हैं, वह एक विकल्प के नाम पर सही तरीके से सेटअप है।


पहले से ही 3 उत्तर हैं जो कि उल्लिखित हैं, जिनमें से एक के तहत उस प्रभाव के लिए आपकी टिप्पणी भी शामिल है। इस जवाब को जोड़ने से सिर्फ उत्तर का सूप खराब होता है।
jpaugh

4
अब 4। मुझे यह उत्तर मददगार लगा, जबकि मुझे अन्य विभिन्न उत्तर सहायक नहीं मिले।
काउलिनेटर

वर्थ नोटिंग सिर्फ इसलिए कि VSWHERE का कहना है कि उपयोग करने के लिए msbuild.exe है, इसका मतलब यह नहीं है कि यदि आप msbuildकमांड लाइन पर टाइप करते हैं (विशेष रूप से विजुअल स्टूडियो कमांड लाइन यदि वह उपयोग कर रहा है), तो वह वह है जिसका उपयोग किया जाएगा। क्या इस्तेमाल किया जाता है देखने के लिए अगर आप टाइप msbuildआदेश पंक्ति पर, ऐसा करते हैं: where msbuild। यदि वह वही रिपोर्ट नहीं कर रहा है जैसा कि VSWHERE कहता है कि नवीनतम और सबसे बड़ा है, तो या तो आपको उस पूर्ण पथ msbuild.exeका उपयोग करना होगा जिसे आप उपयोग करना चाहते हैं, या अपने पैथ चर के अनुरूप समायोजन करें।
जिनले

तो अगला सवाल यह है कि आप किस तरह वैश्यावृत्ति का रास्ता खोजते हैं ....
BJury

17

@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

2
नोट: चूंकि VS2017 / msbuild 15.x अपने रास्तों के लिए रजिस्ट्री का उपयोग नहीं करता है, vswhere msbuild पथ निर्धारित करने के लिए एक विकल्प है।
रॉय डेंटन

1
इसके अलावा, AzizAtif आदमी है। इसके लिए 15.1 बिल्ड पर एक गैंडर लें - github.com/linqpadless/LinqPadless/blob/master/build.cmd
JJS

2
इसके अलावा, vswhere Chocolatey के माध्यम से स्थापित किया जा सकता: chocolatey.org/packages/vswhere
cowlinator

6

यह विजुअल स्टूडियो 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" क्या संदर्भित करता है? क्या यह वीएस संस्करणों में वैध रहेगा?
लाज्लो

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 प्रोग्रामफाइल्स (x86) में स्थित है
Sascha

4

सबसे आसान तरीका हो सकता है कि पॉवरशेल खोलें और दर्ज करें

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 संस्थापन फ़ोल्डर में .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

रजिस्ट्री 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

बेहतर उपलब्ध उपकरण:


1
आपने मेरी जान बचाई
हकन फ़िस्तिक

इसका पहले से ही एक PowerShell संस्करण है। सर्का 2017, क्या पॉवरशेल सीखने से बचने का कोई कारण है?
jpaugh

2
@jpaugh हर बिल्ड सिस्टम में पॉवरशेल उपलब्ध नहीं है।
रूई दांतन

1

आपको नहीं लगता कि यहां जोड़ने के लिए बहुत कुछ है, लेकिन शायद यह सभी संस्करणों में ऐसा करने के एकीकृत तरीके के लिए समय है। मैंने आपके साथ आने के लिए 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
}

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

यह पॉवरशेल विधि कई स्रोतों से 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

पॉवर्सशेल कोड:

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

विज़ुअल स्टूडियो 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) को अनदेखा करने के लिए है।


0

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 इंस्टॉलेशन के लिए सबसे अच्छा तरीका:

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

यदि आप डेल्फी परियोजना को संकलित करना चाहते हैं, तो msbuild + Delphi2009 का उपयोग करते समय "ERROR MSB4040 परियोजना में कोई लक्ष्य नहीं है" को देखें।

सही उत्तर में कहा गया है: " rsvars.bat नामक एक बैच फ़ाइल है ( स्टूडियो फ़ोल्डर में इसके लिए खोज) । MSBuild को कॉल करने से पहले कॉल करें, और यह आवश्यक वातावरण चर सेट करेगा। सुनिश्चित करें कि फ़ोल्डर rsvars में सही हैं। .bat यदि आपके पास डिफ़ॉल्ट के लिए एक अलग स्थान पर संकलक है। "

यह बल्ला न केवल उचित MSBuild.exe संस्करण के साथ उचित .NET फ़ोल्डर में PATH पर्यावरण चर को अद्यतन करेगा, बल्कि अन्य चर चर भी पंजीकृत करता है।


यह उत्तर डेल्फी से संबंधित नहीं है और डेल्फी उपयोगकर्ताओं के लिए अधिक मजबूत नहीं है।
नाशेव

2
क्षमा करने के लिए क्षमा करें। मेरा मतलब था कि मैं डेल्फी से ज्यादा मजबूत काम करता हूं। डेल्फी में इसे करने का एक आसान तरीका हो सकता है, लेकिन ओपी ने डेल्फी के बारे में नहीं पूछा, और इस धागे के कुछ 18 उत्तर हैं जो कुछ कभी देखेंगे। यदि यह आपके लिए महत्वपूर्ण है कि अन्य लोग इसे देखें, तो मेरा सुझाव है कि आप डेल्फी के लिए एक नया प्रश्न बनाएं, और स्व-उत्तर दें। अगर हम MSBuild के हर संस्करण को कवर करने वाले 6 या उससे कम उत्तरों तक उतर गए, तो मुझे बहुत खुशी होगी
jpaugh
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.