Programmatically finding the VS2017 installation directory

前端 未结 10 1199
梦谈多话
梦谈多话 2020-12-06 17:49

With previous versions of VS you could query the registry to determine the installation directory for VS:

HKLM\\SOFTWARE\\Wow6432Node\\Microsoft\\Visu

相关标签:
10条回答
  • 2020-12-06 18:39

    Well, vswhere.exe doesn't really supply more than the Visual Studio edition installation path. Here's my .profile file Interix snippet from 2008 doing the same with a minor update (shell script):

    if [[ -n $PROCESSOR_ARCHITEW6432 || $PROCESSOR_ARCHITECTURE != "x86" ]]; then
      hkeybase='HKLM\SOFTWARE\Wow6432Node\Microsoft\'
    else
      hkeybase='HKLM\SOFTWARE\Microsoft\'
    fi
    for vsver in "15.0" "14.0" "12.0" "11.0" "10.0" "9.0" "8.0"; do
      _vsinstalldir=$(reg.exe query ${hkeybase}'VisualStudio\SxS\VS7' -v $vsver 2>/dev/null \
       | sed -n 's|.*REG_SZ *\([ [:print:]]*\).*|\1|p' | sed 's|\\|/|g')
    if [[ -n $_vsinstalldir ]]; then break; fi
    done; unset vsver
    

    That's enumerating Visual Studio installations favouring the latest in registry key

    HKLM\SOFTWARE\Microsoft\VisualStudio\SxS\VS7
    

    Still working for Visual Studio 2017. Would be easy to translate to cmd syntax. To query the registry is simpler and doesn't require vswhere.exe in your path, thus favourable IMO.

    Now finding the current Visual C++ instance and the SDKs is another task entirely. :D

    Common output in case you wonder:

    C:/Program Files (x86)/Microsoft Visual Studio/2017/Enterprise/
    
    0 讨论(0)
  • 2020-12-06 18:41

    I had a devil of time trying to modify Srekel's answer to search for only VS2017. Note: If you put the "for" statement below inside an "if" block it will wreck the escape characters and won't work.

    SETLOCAL EnableDelayedExpansion
    
    if not exist "%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" (
      echo "WARNING: You need VS 2017 version 15.2 or later (for vswhere.exe)"
    )
    
    set vswherestr=^"!ProgramFiles(x86)!\Microsoft Visual Studio\Installer\vswhere.exe^" -version [15.0,16.0^^) -products * -requires Microsoft.Component.MSBuild -property installationPath
    for /f "usebackq tokens=*" %%i in (`!vswherestr!`) do (  
      set BUILDVCTOOLS=%%i\Common7\Tools
      echo BUILDVCTOOLS: !BUILDVCTOOLS!
      if not exist !BUILDVCTOOLS!\VsDevCmd.bat (
        echo Error: Cannot find VS2017 Build Tools
        goto :buildfailed
      )
      call "!BUILDVCTOOLS!\VsDevCmd.bat"
    )    
    
    0 讨论(0)
  • 2020-12-06 18:42

    I use powershell like KindDragon suggested

    $Is64bitOs = $env:PROCESSOR_ARCHITEW6432 -eq 'AMD64';
    if ($Is64bitOs){
        $registryPath = "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0";
    }
    else {
        $registryPath = "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\14.0";
    }
    
    $VSInstallDir = (Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0 -Name ShellFolder).ShellFolder;
    
    0 讨论(0)
  • 2020-12-06 18:45

    You can use this PowerShell snippet for finding the VS2017 installation directory:

    $vssetup_path = "$([Environment]::GetFolderPath("MyDocuments"))\WindowsPowerShell\Modules\VSSetup"
    if (-not (Test-Path $vssetup_path -pathType container))
    {
        iwr https://github.com/Microsoft/vssetup.powershell/releases/download/1.0.36-rc/VSSetup.zip -OutFile "$env:TEMP\VSSetup.zip"
        Expand-Archive "$env:TEMP\VSSetup.zip" $vssetup_path
    }
    $vs2017 = Get-VSSetupInstance -All | Select-VSSetupInstance -Require 'Microsoft.VisualStudio.Workload.NativeDesktop' -Version '[15.0,16.0)' -Latest
    "Installation Path: " + $vs2017.InstallationPath
    #`vsdevcmd.bat -arch=x86` or `vsdevcmd.bat -arch=amd64` can be used to setup path's to VC++ compiler
    "VsDevCmd.bat Path: " + $vs2017.InstallationPath + "\Common7\Tools\VsDevCmd.bat"
    
    0 讨论(0)
提交回复
热议问题