PowerShell 检测 Visual Studio 并使用其命令行工具

发布于 25 天前  29 次阅读


有时,当我们需要指定 VS 工具链时(例如指定使用 MSVC CLI 的 Clang:clang-cl.exe),纯粹使用 CMake 就不太够用。本文介绍在 PowerShell 中检测 VS 安装,并使用其命令行工具的方法。

定位 VS

Visual Studio (>=2017) 成功安装后,会在本机同时安装一个 vswhere.exe 的软件,该软件可以自动寻找 VS。这样一来不管 VS 安装在哪一个盘符,也不管有多少个不同版本的 VS,都可以利用该软件轻松定位。我们可以通过 ${Env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe 来调用该软件。注意,其中的 $ENV:XXX 语法是 PowerShell 语法。

$VsWhere = "${Env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
& $VsWhere -latest -property installationPath

上述命令给出了本机最新版本的 VS 的安装地址。你也修改参数,获取诸如版本号之类的其余信息。

导入 VS 命令行工具

其实微软官方提供了一套命令行工具,它可以自动把 VS 所需的各种环境变量设置好。安装 VS 后可以看到启动菜单里多出来的 Developer PowerShell for VS 其实就是普通的 PowerShell 添加了一些启动参数而已。我们可以直接把这些启动参数抄下来用:

Import-Module "<VsInstallDir>\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"
Enter-VsDevShell -VsInstallPath $VsInstallDir -SkipAutomaticLocation -Arch amd64 -HostArch amd64

这里的 <VsInstallDir> 应当是上一步获得的 VS 安装目录。

总结

综上所述,我们可以写出这样一个函数:

function Use-VS {
    $VsWhere = "${Env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
    $VsInstallDir = & $VsWhere -latest -property installationPath
    Import-Module "$VsInstallDir\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"
    Enter-VsDevShell -VsInstallPath $VsInstallDir -SkipAutomaticLocation -Arch amd64 -HostArch amd64
}

该函数的执行时间略长(~2s),为了方便,该函数可以放入 $PROFILE,这样既能随时调用,又不会每次启动 PowerShell 都花很久。

只需调用这个函数,就能自动在当前 PowerShell 会话中激活 VS 环境。此时,VS 安装后的 cl.exe, clang.exe, clang-cl.exe, ninja.exe 等软件都可以直接通过命令行调用了。例如,在我的项目中我想指定 VS 不要使用默认的 cl.exe,而使用 MSVC 命令行接口的 LLVM 工具链,那么可以直接给 CMake 传入相应的参数 CMAKE_C_COMPILER=clang-cl.exe 以及 CMAKE_CXX_COMPILER=clang-cl.exe


终有一日, 仰望星空