如何在 PowerShell 上使用 cl 命令?

KiY*_*ter 5 windows powershell windows-10

我无法cl在 PowerShell 中使用该命令。

我尝试将以下命令添加到我的 PowerShell 配置文件到 exec vcbuildtools.bat,但 PowerShell 无法识别 PowerShell 上的cl命令?

&"C:\Program Files (x86)\Microsoft Visual C++ Build Tools\vcbuildtools.bat"
Run Code Online (Sandbox Code Playgroud)

操作系统:Windows 10

dou*_*own 6

为了清楚起见,cl即使在 PowerShell 中运行此问题后,我也正在解决不在 PATH 中的提问者的问题

&"C:\Program Files (x86)\Microsoft Visual C++ Build Tools\vcbuildtools.bat"
Run Code Online (Sandbox Code Playgroud)

我认为这归结为批处理文件无法将变量导出到 PowerShell(也相关:this question)的问题,正如您在vcbuildtools.bat. 我认为这是因为 PowerShell 调用 cmd.exe 子外壳来执行批处理文件,该文件会更改子外壳中的环境,但更改不会传播到父外壳,即 PowerShell。


解决方案1

一种方法是利用子shell 从父shell 继承环境这一事实。因此,如果您在 PowerShell 中运行它,则批处理文件设置的环境将被保留

cmd.exe /k "C:\Program Files (x86)\Microsoft Visual C++ Build Tools\vcbuildtools.bat" `& powershell
Run Code Online (Sandbox Code Playgroud)

注意`&. 该字符必须进行转义,因为它在 PowerShell 中具有特殊含义。


解决方案2

Pscx模块具有Import-VisualStudioVars其导入环境变量的Visual Studio功能。一个示例用法是

Import-VisualStudioVars 2015 amd64
Run Code Online (Sandbox Code Playgroud)

如果您使用 VS/BuildTools 2015 并编译 64 位程序。您可以使用Pop-EnvironmentBlock来还原更改。有关man Import-VisualStudioVars -full更多信息,请参阅。

或者,Pscx 还具有Invoke-BatchFile通过批处理文件保留环境更改的功能。示例用法

Invoke-BatchFile "C:\Program Files (x86)\Microsoft Visual C++ Build Tools\vcbuildtools.bat"
Run Code Online (Sandbox Code Playgroud)

有关man Invoke-Batchfile -full更多信息,请参阅。

笔记

  • 要从PowerShell 库下载最新版本的 Pscx ,您将需要PowerShellGet 随 PowerShell 5 一起提供的 Pscx,并且可以作为 PowerShell 3 和 4 的可下载安装程序使用。
  • 对于使用 PowerShell 1 和 2 的用户,可以在Codeplex上使用旧版本的 Pscx 。