以前のバージョンのVSでは、レジストリをクエリして、VSのインストールディレクトリを確認できました。
HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\14.0
ただし、これはVS2017 RCでは機能しないようです。最新のインストール済みVSを検出して「正しいこと」を実行するスクリプトがあり、これまでのところ、これらのシステムにVS2017を接続する際に問題が発生しています。
VS2017のインストール場所をプログラムで決定する方法を知っている人はいますか?
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/
Visual Studio 2017は、すべてのSKU(Enterprise、Professional、およびCommunity)のレジストリなしのサイドバイサイドインストールをサポートしています。
MSIインストーラーは、ここで説明されているAPIを介してクエリを実行できます: https://blogs.msdn.Microsoft.com/heaths/2016/09/15/changes-to-visual-studio-15-setup/
例はここにあります:
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"
)
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/
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!の使用に注意してください。
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
レジストリからVisual Studioのインストールパスを照会することは可能です。次の回答を参照してください。
https://stackoverflow.com/a/48915860/2338477
バッチ自体を使用してそれをアプリケーションに出力するか、さらに簡単にすることができます。レジストリ関数を使用してキー値をクエリします。
このアプローチの制限は、回答に記載されています。
ここで次の回答を参照してください:
https://stackoverflow.com/a/55754831/2338477
Visual Studioの場所のクエリには、どちらのコマンドラインツールも使用できますが、Visual Studioの場所をクエリするプログラム的な方法も提供します。コードはvswhere
ソースコードに基づいていますが、簡略化されています。
私のパッケージをお勧めします get-vs2017-path 組み込みのWindowsツールのみを使用します(NPM
パッケージとしてビルドされていますが、依存関係はなく、toolsフォルダーは機能しますスタンドアロン)