如何在PowerShell上使用cl命令?

时间:2017-01-30 09:03:38

标签: windows powershell windows-10

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

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

&"C:\Program Files (x86)\Microsoft Visual C++ Build Tools\vcbuildtools.bat"

操作系统:Windows 10

5 个答案:

答案 0 :(得分:2)

要明确我正在解决提问者的问题cl即使在PowerShell中运行后也不在PATH中

&"C:\Program Files (x86)\Microsoft Visual C++ Build Tools\vcbuildtools.bat"

我认为这归结为batch file can't export variables to PowerShell(也与this question}相关的问题,正如您在vcbuildtools.bat中所发现的那样。我认为这是因为PowerShell调用cmd.exe子shell来执行批处理文件,该文件会更改子shell中的环境,但更改不会传播到父shell,即PowerShell。

解决方案1 ​​

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

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

记下`&。该角色必须进行转义,因为它在PowerShell中具有特殊含义。

解决方案2

Pscx module有一个Import-VisualStudioVars函数,用于为Visual Studio导入环境变量。示例用法是

Import-VisualStudioVars 2015 amd64

如果您正在使用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"

有关详细信息,请参阅man Invoke-Batchfile -full

注释

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

答案 1 :(得分:0)

PowerShell库中的另一个选项: posh-vs

使PowerShell中的Visual Studio命令行工具可用。支持Visual Studio 2017和2015。

答案 2 :(得分:0)

您可以使用以下函数来调用cmd.exe Shell脚本(批处理文件)并保留其环境变量:

function Invoke-CmdScript {
  param(
    [String] $scriptName
  )
  $cmdLine = """$scriptName"" $args & set"
  & $env:SystemRoot\system32\cmd.exe /c $cmdLine |
  Select-String '^([^=]*)=(.*)$' | ForEach-Object {
    $varName = $_.Matches[0].Groups[1].Value
    $varValue = $_.Matches[0].Groups[2].Value
    Set-Item Env:$varName $varValue
  }
}

将此功能添加到您的PowerShell配置文件中,并使用以下功能运行批处理文件:

Invoke-CmdScript "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\vsvars32.bat"

答案 3 :(得分:0)

幸运的是,VS 2019社区现在具有一个用于VS 2019的开发人员PowerShell 命令。

enter image description here

如果要查看快捷方式的属性,实际命令相当冗长。

C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -noe -c "&{Import-Module """C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"""; Enter-VsDevShell 14bbfab9}"

无论如何,我正在使用它,它向我的路径添加了正确的cl.exe,但是运行它后却出现一条奇怪的消息:

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\include\ostream(750): warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
.\hey.cpp(4): note: see reference to function template instantiation 'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,const char *)' being compiled

答案 4 :(得分:0)

我也遇到了同样的问题,输入 cmd.exe 将控制权更改为命令行。

PowerShell example

如果你想回到 PowerShell,没问题。只需写exit。听起来很简单