Надежным способом найти место нахождения devenv.exe от Visual Studio 2017

Мне нужно запустить сценарии, которые создают решения для Visual Studio, используя devenv.exe (или devenv.com в этом отношении). Для visual studio 2015 была переменная окружения %VS140COMNTOOLS% которую я мог использовать, чтобы найти место установки devenv. Поскольку для Visual Studio 2017 %VS150COMNTOOLS%, это был бы надежный способ найти место установки devenv в скрипте (bat или powershell).

Ответ 1

Вы можете использовать vswhere.exe или powershell, чтобы найти экземпляры Visual Studio:

for /r "usebackq tokens=1* delims=: " %%i in ('vswhere.exe -latest -requires Microsoft.VisualStudio.Workload.NativeDesktop') do (
    if /i "%%i"=="installationPath" set dir=%%j
)

а также

Install-Module VSSetup -Scope CurrentUser
Get-VSSetupInstance | Select-VSSetupInstance -Latest -Require Microsoft.VisualStudio.Component.VC.Tools.x86.x64

Путь к конкретным рабочим нагрузкам также можно найти в этом API.

https://blogs.msdn.microsoft.com/vcblog/2017/03/06/finding-the-visual-c-compiler-tools-in-visual-studio-2017/

Ответ 2

Одним из способов является использование Power Shell и vswhere.exe. Но я немного ленив, чтобы установить новые инструменты и...

Я пытался найти более простое решение и нашел его в реестре - существует раздел реестра HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\SxS\VS7, в котором перечислены все установки Visual Studio.

Одно из ограничений, упомянутых в этой ссылке: https://developercommunity.visualstudio.com/content/problem/2813/cant-find-registry-entries-for-visual-studio-2017.html

Если установлено более одного выпуска 2017 года, то, похоже, в этом ключе указан последний установленный путь.

Но обычно вы устанавливаете только одну визуальную студию для сборки или использования.

Также я кодировал этот пример с точки зрения 64-битных машин, я думаю, что Wow6432Node не работает на 32-битных машинах, но действительно - сколько разработчиков в настоящее время используют 32-битные машины?

Так что, если вы согласны с вышеуказанными ограничениями, вот простой пакет, который может запросить путь установки Visual Studio:

test.bat :

@echo off
setlocal 
call:vs%1 2>nul
if "%n%" == "" (
    echo Visual studio is not supported.
    exit /b
)
for /f "tokens=1,2*" %%a in ('reg query "HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\SxS\VS7" /v "%n%.0" 2^>nul') do set "VSPATH=%%c"
if "%VSPATH%" == "" (
    echo Visual studio %1 is not installed on this machine
    exit /b
)

echo Visual studio %1 path is "%VSPATH%"
endlocal & exit /b

:vs2017
    set /a "n=%n%+1"
:vs2015
    set /a "n=%n%+2"
:vs2013
    set /a "n=%n%+1"
:vs2012
    set /a "n=%n%+1"
:vs2010
    set /a "n=%n%+10"
    exit /b

Может быть выполнено так:

>test 2010
Visual studio 2010 path is "C:\Program Files (x86)\Microsoft Visual Studio 10.0\"

>test 2012
Visual studio 2012 path is "C:\Program Files (x86)\Microsoft Visual Studio 11.0\"

>test 2013
Visual studio 2013 path is "C:\Program Files (x86)\Microsoft Visual Studio 12.0\"

>test 2014
Visual studio is not supported.

>test 2015
Visual studio 2015 path is "C:\Program Files (x86)\Microsoft Visual Studio 14.0\"

>test 2017
Visual studio 2017 path is "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\"

Ответ 3

Здесь функция PowerShell, которую можно использовать для получения пути DevEnv.exe. Вы также можете легко изменить его, чтобы найти другие общие компоненты, такие как MsBuild.exe или TF.exe просто изменив жестко DevEnv.exe строку DevEnv.exe используемую в -Filter.

function Get-DevEnvExecutableFilePath
{
    [bool] $vsSetupExists = $null -ne (Get-Command Get-VSSetupInstance -ErrorAction SilentlyContinue)
    if (!$vsSetupExists)
    {
        Write-Verbose "Importing the VSSetup module..."
        Install-Module VSSetup -Scope CurrentUser -Force
    }
    [string] $visualStudioInstallationPath = (Get-VSSetupInstance | Select-VSSetupInstance -Latest -Require Microsoft.Component.MSBuild).InstallationPath

    $devEnvExecutableFilePath = (Get-ChildItem $visualStudioInstallationPath -Recurse -Filter "DevEnv.exe" | Select-Object -First 1).FullName
    return $devEnvExecutableFilePath
}

Ответ 4

Мое собственное решение с использованием реестра здесь, к сожалению, не работает для Visual Studio 2019, поскольку возможно запросить путь установки vs2019 из пути удаления реестра, но это становится немного сложнее, так как вам может потребоваться пройти через разделы дополнительного реестра.

Я попробовал также немного vswhere.exe, но его использование также немного сложнее - нужно повторить его вывод.

В то же время мне нужно что-то похожее на vswhere, я взглянул на его реализацию и переписал его под моим собственным инструментом командной строки, который называется cppexec.exe.

Использование это так:

D:\Prototyping\cppscriptcore>cppexec.exe -location
Visual studio 2019:
location: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise

Visual studio 2017:
location: C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise

D:\Prototyping\cppscriptcore>cppexec.exe -location -vs 2017
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise

D:\Prototyping\cppscriptcore>cppexec.exe -location -vs 2019
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise

Чтобы использовать его, загрузите два файла:

https://github.com/tapika/cppscriptcore/blob/master/cppexec.exe https://github.com/tapika/cppscriptcore/blob/master/SolutionProjectModel.dll

Если вы заинтересованы в интеграции в свой собственный проект, взгляните на следующие исходные коды:

https://github.com/tapika/cppscriptcore/blob/master/SolutionProjectModel/VisualStudioInfo.cpp https://github.com/tapika/cppscriptcore/blob/master/SolutionProjectModel/VisualStudioInfo.h

Я перекодировал vswhere в несколько проще.