web-dev-qa-db-fra.com

Recherche par programme du répertoire d'installation VS2017

Avec les versions précédentes de VS, vous pouvez interroger le registre pour déterminer le répertoire d'installation de VS:

HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\14.0

Cependant, cela ne semble pas fonctionner avec le VS2017 RC. Nous avons des scripts qui détectent le dernier VS installé et font ensuite "ce qu'il faut", et jusqu'à présent, j'ai des problèmes pour brancher le VS2017 sur ces systèmes.

Est-ce que quelqu'un sait comment déterminer par programme l'emplacement d'installation de VS2017?

6
Brad

Vous pouvez utiliser vswhere tool pour obtenir l'emplacement de VS2017.

Exemple:

@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" %*
)

Vous pouvez en savoir plus à ce sujet ici: https://blogs.msdn.Microsoft.com/heaths/2017/02/25/vswhere-available/

11
KindDragon

Visual Studio 2017 prend en charge les installations côte à côte, sans registre, de toutes les SKU (Entreprise, Professionnel et Communauté).

Les installeurs MSI peuvent interroger via les API décrites ici: https://blogs.msdn.Microsoft.com/heaths/2016/09/15/changes-to-visual-studio-15-setup/

Les exemples sont ici:

5
sean e

Eh bien, vswhere.exe ne fournit pas vraiment plus que le chemin d’installation de l’édition Visual Studio. Voici mon extrait de fichier .profile Interix de 2008 faisant de même avec une mise à jour mineure (script Shell):

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

Cela énumère les installations de Visual Studio privilégiant la dernière clé de registre.

HKLM\SOFTWARE\Microsoft\VisualStudio\SxS\VS7

Je travaille toujours pour Visual Studio 2017. Il serait facile de traduire en syntaxe cmd. Pour interroger le registre est plus simple et ne nécessite pas vswhere.exe dans votre chemin, donc favorable OMI. 

Rechercher l’instance actuelle de Visual C++ et les kits de développement logiciel est une toute autre tâche. :RÉ

Sortie commune au cas où vous vous demanderiez:

C:/Program Files (x86)/Microsoft Visual Studio/2017/Enterprise/
1
BeErikk

La solution de KindDragon ne fonctionnait pas tout à fait pour moi en raison de la "fonctionnalité" de "développement différé" de batch. (WAT)

Voici mon code, compatible avec VS 2017 15.2 (pour l'installation de 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"
)

Noter particulièrement l'utilisation de SETLOCAL EnableDelayedExpansion et! InstallDir! 

1
Srekel

J'ai eu du mal à essayer de modifier la réponse de Srekel pour ne rechercher que VS2017. Remarque: Si vous mettez l'instruction "for" ci-dessous à l'intérieur d'un bloc "if", elle détruira les caractères d'échappement et ne fonctionnera pas.

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
mdrissel

Il est possible d'interroger le chemin d'installation de Visual Studio à partir du registre, voir la réponse suivante:

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

Vous pouvez utiliser le traitement par lots lui-même et le restituer à l’application ou encore plus simplement - utiliser les fonctions de registre pour interroger la valeur de la clé.

Les limites de cette approche sont décrites dans la réponse.

0
TarmoPikaro

Puis-je recommander mon paquet get-vs2017-path il n’utilise que les outils Windows intégrés (et bien qu’il soit construit comme un paquet NPM, il n’a pas de dépendances et le dossier des outils fonctionne de manière autonome)

0
Refael Ackermann