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

3

我需要编写一个批处理文件来完成Visual Studio中的预构建步骤。其中,我需要调用Visual Studio开发人员命令提示符。

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

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


1
你怎么知道哪个版本是“正确”的? - SomethingDark
1
@SomethingDark 我是指最新的版本。已更新以反映这一点。 - Gustav Bertram
请查看以下链接的内容:https://gist.github.com/juntalis/10433731 - elzooilogico
你是说你的构建机器上安装了多个VS(比如VS 2013、VS 2015和VS 2017都在一起)吗?我有一个脚本可以在所有不同的机器上运行,但前提是它们只安装了一个VS。 - dushyantp
@dushyantp 不,我的意思是一台机器安装了VS2015,另一台机器安装了VS2017的构建工具。 - Gustav Bertram
3个回答

5

您应该使用由 Microsoft Visual Studio Installer 提供的 vswhere 工具。您需要将 vswhere.exe 复制到已知位置。该维基页面有关于如何启动开发人员命令提示符的说明:

@if not defined _echo echo off
for /f "usebackq delims=" %%i in (`vswhere.exe -prerelease -latest -property installationPath`) do (
  if exist "%%i\Common7\Tools\vsdevcmd.bat" (
    %comspec% /k "%%i\Common7\Tools\vsdevcmd.bat" %*
    exit /b
  )
)

rem Instance or command prompt not found
exit /b 2

1
我为CI-CD机器所做的事情是对于非2017年的机器使用vcvarsall,对于2017年的机器则使用vsdevcmd。以下是脚本片段:
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~2\Micros~1.0\vc\vcvarsall.bat" (
    call c:\progra~2\Micros~1.0\vc\vcvarsall.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 Studio\2017"

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(在特定文件夹中以减少搜索时间)并运行它。 希望这有所帮助。


0

我成功地拼凑了一个批处理文件,它会查看参数,然后再查看文件系统,试图找出应该使用哪个版本的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 Studio\2017\Enterprise\Common7\Tools\VsDevCmd.bat" (
    SET vsversion="VS2017 Enterprise"
  ) else if exist "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\Tools\VsDevCmd.bat" (
    SET vsversion="VS2017 Professional"
  ) else if exist "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\VsDevCmd.bat" (
    SET vsversion="VS2017 Community"
  ) else if exist "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\VsDevCmd.bat" (
    SET vsversion="VS2015"
  ) else if exist "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\VsDevCmd.bat" (
    SET vsversion="VS2013"
  ) else goto :eof
) else if [%1] == ["*Undefined*"] (
  if exist "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\Tools\VsDevCmd.bat" (
    SET vsversion="VS2017 Enterprise"
  ) else if exist "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\Tools\VsDevCmd.bat" (
    SET vsversion="VS2017 Professional"
  ) else if exist "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\VsDevCmd.bat" (
    SET vsversion="VS2017 Community"
  ) else if exist "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\VsDevCmd.bat" (
    SET vsversion="VS2015"
  ) else if exist "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\VsDevCmd.bat" (
    SET vsversion="VS2013"
  ) else goto :eof
) else (
  if [%1] == ["C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\"] (
    SET vsversion="VS2017 Enterprise"
  ) else if [%1] == ["C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\"] (
    SET vsversion="VS2017 Professional"
  ) else if [%1] == ["C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\"] (
    SET vsversion="VS2017 Community"
  ) else if [%1] == ["C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\" (
    SET vsversion="VS2015"
  ) else if [%1] == ["C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\" (
    SET vsversion="VS2013"
  ) else goto :eof
)

if %vsversion% == "VS2017 Enterprise" (
    SET vsdevcmd="C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\Tools\VsDevCmd.bat"
    ECHO VS2017 Enterprise
) else if %vsversion% == "VS2017 Professional" (
    SET vsdevcmd="C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\Tools\VsDevCmd.bat"
    ECHO VS2017 Professional
) else if %vsversion% == "VS2017 Community" (
    SET vsdevcmd="C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\VsDevCmd.bat"
    ECHO VS2017 Community
) else if %vsversion% == "VS2015" (
    SET vsdevcmd="C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\VsDevCmd.bat"
    ECHO VS2015
) else if %vsversion% == "VS2013" (
    SET vsdevcmd="C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\VsDevCmd.bat"
    ECHO VS2013
) else goto :eof

call %vsdevcmd%

1
VS2017部分太啰嗦了。你应该简单地使用vswhere来简化它们,https://github.com/Microsoft/vswhere - Lex Li

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接