Программный поиск каталога установки VS2017

В предыдущих версиях VS вы могли запросить реестр, чтобы определить каталог установки VS:

HKLM \ SOFTWARE \ Wow6432Node \ Microsoft \ VisualStudio \ 14.0

Однако, похоже, это не работает с VS2017 RC. У нас есть сценарии, которые обнаруживают последнюю установленную VS, а затем делают «правильные вещи», и пока у меня возникают проблемы с подключением VS2017 к этим системам.

Кто-нибудь знает, как программно определить место установки VS2017?


person Brad    schedule 12.12.2016    source источник
comment
Приложения не должны использовать узлы Wow. Они существуют только в системах x64, чтобы позволить приложениям x86 работать. Вы проверили узел HKLM\SOFTWARE\Microsoft\VisualStudio\15.0\Setup? Как бы то ни было, структура диска изменилась сильно. Почти все теперь можно найти в `% PROGRAM FILES% \ Microsoft Visual Studio 15.0`   -  person Panagiotis Kanavos    schedule 12.12.2016


Ответы (10)


Вы можете использовать инструмент vswhere, чтобы получить местоположение VS2017.

Пример:

@echo off

rem VS2017U2 contains vswhere.exe
if "%VSWHERE%"=="" set "VSWHERE=%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"

for /f "usebackq tokens=*" %%i in (`"%VSWHERE%" -latest -products * -requires Microsoft.Component.MSBuild -property installationPath`) do (
  set InstallDir=%%i
)

if exist "%InstallDir%\MSBuild\15.0\Bin\MSBuild.exe" (
  "%InstallDir%\MSBuild\15.0\Bin\MSBuild.exe" %*
)

Подробнее об этом можно прочитать здесь: https://blogs.msdn.microsoft.com/heaths/2017/02/25/vswhere-available/

person KindDragon    schedule 26.02.2017
comment
Я перехожу к этому как к принятому ответу, поскольку он дает мне пример того, как я могу скрипт получить путь. - person Brad; 11.05.2017
comment
Это не совсем сработало для меня - посмотрите изменения, которые мне нужно было сделать в моем ответе. - person Srekel; 02.06.2017
comment
Это работает, если vswhere находится на пути по умолчанию, а это не так. См. Ответ @Srekel ниже ... - person N Jones; 28.06.2017
comment
vswhere - это автономный exe, поэтому вы всегда можете скопировать его куда угодно - person bytedev; 05.09.2018
comment
% VSWHERE% -latest может быть не лучшей идеей, если у вас установлены и VS2017, и VS2019; вы можете попробовать% VSWHERE% -version [15.0,16.0), но точно указать на VS2017 - person veritas; 20.11.2020

Visual Studio 2017 поддерживает параллельную установку без реестра всех SKU (Enterprise, Professional и Community).

Установщики MSI могут запрашивать через API, описанные здесь: https://blogs.msdn.microsoft.com/heaths/2016/09/15/changes-to-visual-studio-15-setup/

Примеры здесь:

person sean e    schedule 12.12.2016
comment
Я подумал, что это что-то вроде бок о бок - спасибо за ссылки! - person Brad; 13.12.2016

Решение KindDragon не совсем сработало для меня из-за «функции отложенного расширения» пакета. (WAT)

Вот мой код, совместимый с VS 2017 15.2 (для установки vswhere.exe)

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)"
)

for /f "usebackq tokens=*" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -products * -requires Microsoft.Component.MSBuild -property installationPath`) do (
  set InstallDir=%%i
)

if exist "!InstallDir!\VC\Auxiliary\Build\vcvars64.bat" (
  call "!InstallDir!\VC\Auxiliary\Build\vcvars64.bat"
) else (
  echo "Could not find !InstallDir!\VC\Auxiliary\Build\vcvars64.bat"
)

Особо обратите внимание на использование SETLOCAL EnableDelayedExpansion и! InstallDir!

person Srekel    schedule 02.06.2017
comment
Я не вижу, как факторы отсроченного расширения в решении KindDragon - это было бы актуально только в том случае, если бы набор и получение переменной среды были вложены в один оператор ... поскольку его решение работает для меня - person Brad; 02.06.2017
comment
Я не знаю, чувак. Я вставил его в свой командный файл, и он не сработал, по-видимому, потому, что не расширил переменную InstallDir во время выполнения. Затем я использовал EnabledDelayedExpansion, и у меня это сработало. Я ненавижу командные файлы и не очень хотел понимать, что пошло не так, и рад, что нашел решение: D Отправил его в надежде, что это может помочь кому-то другому. - person Srekel; 03.06.2017
comment
Этот фрагмент действительно работает, потому что он не предполагает, что vswhere находится на пути. Для тех, кто интересуется отложенным расширением, все, что он делает, это разрешает раскрытие переменных с использованием синтаксиса !somevar! в циклических и условных блоках. В принятом в настоящее время ответе @KindDragon не используется отложенное расширение, поэтому я предполагаю, что @Srekel имеет в виду свою собственную конструкцию, не работающую без нее. - person N Jones; 28.06.2017
comment
IIRC, проблема возникла при попытке реально использовать переменную InstallDir. Без отложенных расширений использование его с традиционным поиском% не работает, потому что тогда он имеет значение, которое имеет в начале командного файла, то есть ничего. - person Srekel; 29.06.2017

Что ж, vswhere.exe на самом деле не предоставляет больше, чем путь установки версии Visual Studio. Вот мой фрагмент Interix из файла .profile от 2008 года, который делает то же самое с небольшим обновлением (сценарий оболочки):

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

Это перечисляет установки Visual Studio, отдавая предпочтение последней версии раздела реестра.

HKLM\SOFTWARE\Microsoft\VisualStudio\SxS\VS7

Все еще работаю с Visual Studio 2017. Было бы легко перевести на синтаксис cmd. Запросить реестр проще и не требует vswhere.exe на вашем пути, что благоприятно для IMO.

Теперь поиск текущего экземпляра Visual C ++ и пакетов SDK - это совсем другая задача. : D

Общий вывод на случай, если вам интересно:

C:/Program Files (x86)/Microsoft Visual Studio/2017/Enterprise/
person BeErikk    schedule 15.09.2017

У меня было дьявольское время, пытаясь изменить ответ Срекеля, чтобы искать только VS2017. Примечание. Если вы поместите оператор «for» ниже внутри блока «if», он приведет к повреждению escape-символов и не будет работать.

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"
)    
person mdrissel    schedule 26.10.2018

Могу я порекомендовать свой пакет get-vs2017-path, в котором используются только встроенные инструменты Windows (и хотя он построен как пакет NPM, у него нет зависимостей, а папка инструментов работает автономно)

person Refael Ackermann    schedule 17.02.2017

См. Следующий ответ здесь:

https://stackoverflow.com/a/55754831/2338477

Вы можете использовать любой инструмент командной строки для запроса местоположения Visual Studio, но я также предоставляю программный способ запроса местоположения Visual Studio. Код основан на vswhere исходном коде, но упрощен.

person TarmoPikaro    schedule 14.05.2019

У нас всего 3 редакции Visual Studio.

  • \Сообщество
  • \ Профессиональный
  • \Предприятие

Таким образом, мы можем все немного упростить.
Вот несколько протестированных сценариев CMD.

@SET env_all_vs2017_root=%ProgramFiles(x86)%\Microsoft Visual Studio\2017
@SET env_vs2017_path="%env_all_vs2017_root%\Professional"
@IF NOT EXIST %env_vs2017_path%  SET env_vs2017_path="%env_all_vs2017_root%\Community"
@IF NOT EXIST %env_vs2017_path%  SET env_vs2017_path="%env_all_vs2017_root%\Enterprise"
@REM Let's fail laudly
@IF NOT EXIST %env_vs2017_path%  SET "env_vs2017_path=Visual Studio 2017 install path was not found by %~nx0"

@REM  You may want to remove quotes
@SET unquoted=%env_vs2017_path:"=%


@REM  And now let's see the result and PAUSE

@ECHO VS 2017 install path is
@ECHO %unquoted%

@PAUSE
person it3xl    schedule 06.09.2019

Вы можете использовать этот фрагмент PowerShell для поиска каталога установки VS2017:

$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"
person KindDragon    schedule 31.01.2017
comment
Эй, вы пытались пронести модуль в мою систему ????. В любом случае это не удалось в моей системе ... (-not (Test-Path $vssetup_path -pathType container)) -eq 0 поэтому модуль не установился - person Refael Ackermann; 17.02.2017

Я использую powershell, как предложил KindDragon

$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;
person DOMZE    schedule 17.02.2017
comment
Это путь к VS2015, а не к 2017 году - person KindDragon; 28.02.2017
comment
Я не уверен насчет новой версии VS2017, но, возможно, изменить 14.0 на 15.0? - person DOMZE; 28.02.2017
comment
Нет, VS2017 не использует реестр - person KindDragon; 01.03.2017