如何在批处理文件中找到最新的 Visual Studio 开发人员命令提示符



我需要编写一个批处理文件才能在Visual Studio中完成预构建步骤。作为其中的一部分,我需要调用Visual Studio Developer Command Prompt。

我知道对于VS2015,开发人员命令提示符位于C:Program Files (x86)Microsoft Visual Studio 14.0Common7ToolsVsDevCmd.bat

不幸的是,我们的构建服务器具有不同版本的VS。是否有一种简单的方法可以在批处理文件中查找所有(或大多数)版本的 Visual Studio 的最新VSDevCmd.bat,以便预生成步骤适用于这两种环境?

你应该使用 Microsoft Visual Studio 安装程序提供的 vswhere。将vswhere.exe复制到已知位置。Wiki 有关于如何启动开发人员命令提示符的说明:

@if not defined _echo echo off
for /f "usebackq delims=" %%i in (`vswhere.exe -prerelease -latest -property installationPath`) do (
  if exist "%%iCommon7Toolsvsdevcmd.bat" (
    %comspec% /k "%%iCommon7Toolsvsdevcmd.bat" %*
    exit /b
  )
)
rem Instance or command prompt not found
exit /b 2

我为 CI-CD 机器所做的是将 vcvarsall 用于非 2017 机器,将 vsdevcmd 用于 2017 机器。脚本片段如下:

rem vsvarsall.bat does not work if there are quoted paths on %PATH%
set path=%path:"=%
rem this will work for non VS 2017 build machines
if exist "c:progra~2Micros~1.0vcvcvarsall.bat" (
    call c:progra~2Micros~1.0vcvcvarsall.bat && goto :SetVSEnvFinished
)
echo vcvarsall.bat not found, looking for vsdevcmd.bat
rem Find and run vsdevcmd.bat
set "VS_PATH=C:Program Files (x86)Microsoft Visual Studio2017"
rem The 2017 folder will not be present in Visual Studio 2017 Preview machines (such as 15.8 preview)
if not exist "%VS_PATH%" (
    set "VS_PATH=C:Program Files (x86)Microsoft Visual Studio"
)
if not exist "%VS_PATH%" (
    echo "%VS_PATH%" not found. Is Visual Studio installed? && goto :ErrorExit
)
for /f "delims=" %%F in ('dir /b /s "%VS_PATH%vsdevcmd.bat" 2^>nul') do set VSDEVCMD_PATH=%%F
echo ********Executing %VSDEVCMD_PATH%********
call "%VSDEVCMD_PATH%"
goto :SetVSEnvFinished
:ErrorExit
exit /b 1
:SetVSEnvFinished

因此,对于非2017年的版本,它将执行vcvarsall.bat(设置VS环境)。对于 2017 版本,它将搜索 vsdevcmd.bat(在特定文件夹中以减少搜索时间)并运行它。希望这有帮助。

我设法拼凑了一个批处理文件,该文件查看参数,然后查看文件系统,以尝试找出应该使用哪个版本的 VSDevCmd。 $(DevEnvDir)有时是*Undefined*的,所以我们也需要检查一下。

在 VS2015 专业版、VS2017

专业版和 VS2017 企业版上进行测试。

REM Usage in VS build event: call "$(SolutionDir)find_vsdevcmd.bat" "$(DevEnvDir)"
SET vsversion=
REM Get Visual Studio version, either from command prompt, or newest on filesystem 
if [%1] == [] (
  if exist "C:Program Files (x86)Microsoft Visual Studio2017EnterpriseCommon7ToolsVsDevCmd.bat" (
    SET vsversion="VS2017 Enterprise"
  ) else if exist "C:Program Files (x86)Microsoft Visual Studio2017ProfessionalCommon7ToolsVsDevCmd.bat" (
    SET vsversion="VS2017 Professional"
  ) else if exist "C:Program Files (x86)Microsoft Visual Studio2017CommunityCommon7ToolsVsDevCmd.bat" (
    SET vsversion="VS2017 Community"
  ) else if exist "C:Program Files (x86)Microsoft Visual Studio 14.0Common7ToolsVsDevCmd.bat" (
    SET vsversion="VS2015"
  ) else if exist "C:Program Files (x86)Microsoft Visual Studio 12.0Common7ToolsVsDevCmd.bat" (
    SET vsversion="VS2013"
  ) else goto :eof
) else if [%1] == ["*Undefined*"] (
  if exist "C:Program Files (x86)Microsoft Visual Studio2017EnterpriseCommon7ToolsVsDevCmd.bat" (
    SET vsversion="VS2017 Enterprise"
  ) else if exist "C:Program Files (x86)Microsoft Visual Studio2017ProfessionalCommon7ToolsVsDevCmd.bat" (
    SET vsversion="VS2017 Professional"
  ) else if exist "C:Program Files (x86)Microsoft Visual Studio2017CommunityCommon7ToolsVsDevCmd.bat" (
    SET vsversion="VS2017 Community"
  ) else if exist "C:Program Files (x86)Microsoft Visual Studio 14.0Common7ToolsVsDevCmd.bat" (
    SET vsversion="VS2015"
  ) else if exist "C:Program Files (x86)Microsoft Visual Studio 12.0Common7ToolsVsDevCmd.bat" (
    SET vsversion="VS2013"
  ) else goto :eof
) else (
  if [%1] == ["C:Program Files (x86)Microsoft Visual Studio2017EnterpriseCommon7IDE"] (
    SET vsversion="VS2017 Enterprise"
  ) else if [%1] == ["C:Program Files (x86)Microsoft Visual Studio2017ProfessionalCommon7IDE"] (
    SET vsversion="VS2017 Professional"
  ) else if [%1] == ["C:Program Files (x86)Microsoft Visual Studio2017CommunityCommon7IDE"] (
    SET vsversion="VS2017 Community"
  ) else if [%1] == ["C:Program Files (x86)Microsoft Visual Studio 14.0Common7IDE" (
    SET vsversion="VS2015"
  ) else if [%1] == ["C:Program Files (x86)Microsoft Visual Studio 12.0Common7IDE" (
    SET vsversion="VS2013"
  ) else goto :eof
)
if %vsversion% == "VS2017 Enterprise" (
    SET vsdevcmd="C:Program Files (x86)Microsoft Visual Studio2017EnterpriseCommon7ToolsVsDevCmd.bat"
    ECHO VS2017 Enterprise
) else if %vsversion% == "VS2017 Professional" (
    SET vsdevcmd="C:Program Files (x86)Microsoft Visual Studio2017ProfessionalCommon7ToolsVsDevCmd.bat"
    ECHO VS2017 Professional
) else if %vsversion% == "VS2017 Community" (
    SET vsdevcmd="C:Program Files (x86)Microsoft Visual Studio2017CommunityCommon7ToolsVsDevCmd.bat"
    ECHO VS2017 Community
) else if %vsversion% == "VS2015" (
    SET vsdevcmd="C:Program Files (x86)Microsoft Visual Studio 14.0Common7ToolsVsDevCmd.bat"
    ECHO VS2015
) else if %vsversion% == "VS2013" (
    SET vsdevcmd="C:Program Files (x86)Microsoft Visual Studio 12.0Common7ToolsVsDevCmd.bat"
    ECHO VS2013
) else goto :eof
call %vsdevcmd%

最新更新