web-dev-qa-db-ja.com

プログラムによるVS2017インストールディレクトリの検索

以前のバージョンのVSでは、レジストリをクエリして、VSのインストールディレクトリを確認できました。

HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\14.0

ただし、これはVS2017 RCでは機能しないようです。最新のインストール済みVSを検出して「正しいこと」を実行するスクリプトがあり、これまでのところ、これらのシステムにVS2017を接続する際に問題が発生しています。

VS2017のインストール場所をプログラムで決定する方法を知っている人はいますか?

9
Brad

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/

12
KindDragon

Visual Studio 2017は、すべてのSKU(Enterprise、Professional、およびCommunity)のレジストリなしのサイドバイサイドインストールをサポートしています。

MSIインストーラーは、ここで説明されているAPIを介してクエリを実行できます: https://blogs.msdn.Microsoft.com/heaths/2016/09/15/changes-to-visual-studio-15-setup/

例はここにあります:

5
sean e

VS2017のみを検索するようにSrekelの回答を変更しようとする時間の悪魔がありました。注:以下の「for」ステートメントを「if」ブロック内に配置すると、エスケープ文字が壊れて機能しなくなります。

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

vswhere.exeは、Visual Studioエディションのインストールパス以上のものを提供しません。これは、マイナーアップデート(シェルスクリプト)で同じことを行う2008のInterixスニペットの.profileファイルです。

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/
1
BeErikk

KindDragonのソリューションは、バッチの「遅延拡張」「機能」のため、私にとってはうまくいきませんでした。 (ワット)

これが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!の使用に注意してください。

1
Srekel

Visual Studioのエディションは3つしかありません。

  • \コミュニティ
  • \プロフェッショナル
  • \企業

そのため、すべてを少し単純化できます。
テスト済みの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
0
it3xl

レジストリからVisual Studioのインストールパスを照会することは可能です。次の回答を参照してください。

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

バッチ自体を使用してそれをアプリケーションに出力するか、さらに簡単にすることができます。レジストリ関数を使用してキー値をクエリします。

このアプローチの制限は、回答に記載されています。

0
TarmoPikaro

ここで次の回答を参照してください:

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

Visual Studioの場所のクエリには、どちらのコマンドラインツールも使用できますが、Visual Studioの場所をクエリするプログラム的な方法も提供します。コードはvswhereソースコードに基づいていますが、簡略化されています。

0
TarmoPikaro

私のパッケージをお勧めします get-vs2017-path 組み込みのWindowsツールのみを使用します(NPMパッケージとしてビルドされていますが、依存関係はなく、toolsフォルダーは機能しますスタンドアロン)

0