我需要编写一个批处理文件才能在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*
的,所以我们也需要检查一下。
专业版和 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%