How do I call Visual Studio 2017 RC's version of MSBuild from a BAT file?

后端 未结 9 818
暖寄归人
暖寄归人 2020-12-04 19:19

Earlier versions of MSBuild could be found here: %programfiles(x86)%\\msbuild\\\\bin\\msbuild.exe.

But for Visual Studio 2017RC the path

相关标签:
9条回答
  • 2020-12-04 19:57

    SO I have Community edition 2017, for me path is: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\

    Other solutions on this thread throwed me an exception.

    0 讨论(0)
  • 2020-12-04 20:02

    The supported way

    VS2017's setup engine has an interop API that allows you to query information about which instance(s) of VS2017 are installed. There's a NuGet package for it, and even a sample of how to query, including the installation path. For consumption in a batch or PS file, you might just rewrite the sample app and call it from your script to output the information you need.

    The unsupported way

    The VS setup engine keeps a store of its data under %ProgramData%\Microsoft\VisualStudio\Packages\_Instances. There will be a folder for each instance of VS2017, and inside that folder is a state.json file that contains information about that installation, including the install path.

    Since you need to extract the info from the .json file, you have the option to either write an app that you call from your script file, or come up with some parsing logic directly in your script. This will obviously be fragile as the JSON schema or file location may change.

    The brute force method

    Assuming you are using the default installation path, you could just recursively search for msbuild.exe under %ProgramFiles(x86)%\Microsoft Visual Studio\ (it appears that there will be 32-bit and 64-bit msbuild.exe for each VS instance). This would probably be the easiest to do within your script file, but does rely on the default installation path (or whatever hardcoded path you wish to search under).

    Change your dev environment requirements

    The last thing you could do is require that devs use (or somehow invoke) the vsdevcmd.bat to use the VS dev environment. This will get them MSBuild, and additionally any other tools from the VS environment, onto their %PATH%. This does place a requirement on your dev team, but will always be an officially supported way to find msbuild.exe.

    0 讨论(0)
  • 2020-12-04 20:08

    Posting this for folks still trying to locate the newest version of msbuild on a machine and fall back to an older one if that is availble instead. I find this snippet of powershell does the trick, which can easily be invoked from a bat file.

    Function Find-MsBuild([int] $MaxVersion = 2017)
    {
        $agentPath = "$Env:programfiles (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\msbuild.exe"
        $devPath = "$Env:programfiles (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\msbuild.exe"
        $proPath = "$Env:programfiles (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\msbuild.exe"
        $communityPath = "$Env:programfiles (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\msbuild.exe"
        $fallback2015Path = "${Env:ProgramFiles(x86)}\MSBuild\14.0\Bin\MSBuild.exe"
        $fallback2013Path = "${Env:ProgramFiles(x86)}\MSBuild\12.0\Bin\MSBuild.exe"
        $fallbackPath = "C:\Windows\Microsoft.NET\Framework\v4.0.30319"
    
        If ((2017 -le $MaxVersion) -And (Test-Path $agentPath)) { return $agentPath } 
        If ((2017 -le $MaxVersion) -And (Test-Path $devPath)) { return $devPath } 
        If ((2017 -le $MaxVersion) -And (Test-Path $proPath)) { return $proPath } 
        If ((2017 -le $MaxVersion) -And (Test-Path $communityPath)) { return $communityPath } 
        If ((2015 -le $MaxVersion) -And (Test-Path $fallback2015Path)) { return $fallback2015Path } 
        If ((2013 -le $MaxVersion) -And (Test-Path $fallback2013Path)) { return $fallback2013Path } 
        If (Test-Path $fallbackPath) { return $fallbackPath } 
    
        throw "Yikes - Unable to find msbuild"
    }
    
    
    $msbuildPath = Find-MsBuild 2017
    
    0 讨论(0)
提交回复
热议问题