【问题标题】:Running VS 2017 Build Tools in Windows PowerShell在 Windows PowerShell 中运行 VS 2017 构建工具
【发布时间】:2017-12-17 12:24:22
【问题描述】:

我不喜欢 IDE,所以我安装了 VS 2017 构建工具,这样我就可以通过命令行工作了。

安装很顺利,一切都可以在 Windows CMD 下运行,但是,PowerShell 要好得多,我更喜欢使用 PS。这里的问题是,根据MSDN

Visual C++ 命令行工具使用 PATH、TMP、INCLUDE、LIB 和 LIBPATH 环境变量,也可能使用工具特定的环境变量。由于这些环境变量的值特定于您的安装,并且可以通过产品更新或升级进行更改,因此我们建议您使用 vcvarsall.bat 或开发人员命令提示符快捷方式,而不是自己设置它们。有关编译器和链接器使用的特定环境变量的信息,请参阅 CL 环境变量和 LINK 环境变量。

我不应该自己设置环境变量,这对我来说很好,唯一的问题是当我在 PS 中运行vcvarsall.bat 时,环境变量没有改变。我是 PS 新手,所以我猜 .bat 文件不能更改会话环境变量。如果是这样的话,那我就没法PS了。附带说明一下,CLLINK 变量永远不会出现,我将在下面解释。

我想我应该找出变量是什么。在运行batch 文件之前和之后,我将所有变量echoed 到一个文本文件中,并编写了一个简短的Java 程序来查找任何新的或修改的内容。这些是them。如您所见,CLLINK 变量不存在。

我该如何解决这个问题?我正在考虑编写我自己的batch 文件,但如果第一个文件不起作用,我的文件为什么会这样呢?我在附加的 MSDN 页面上没有看到任何内容,也没有看到任何关于如何使其适用于 PowerShell 的链接。

【问题讨论】:

  • 您链接的 MSDN 页面上对 CL Environment VariablesLINK Environment Variables 的引用是链接。您是否关注他们以查看他们添加的内容?
  • 编写一个批处理文件,1) 调用 vcvarsall.bat,2) 调用 PowerShell。然后,PowerShell 将使用为其准备的环境块运行。反过来也行不通,因为 PowerShell 本身不执行批处理文件——它依赖cmd 来执行此操作,并且作为子进程,它有自己的环境块,不会反映在其父进程上。
  • @KenWhite 都应该添加同名变量:CL_CL_LINK_Link_。这些都没有出现,这就是我的意思。
  • 您应该使用当前版本的docs,您可能会注意到 CL 工具使用 CL 环境变量 if defined 将内容添加到命令中,因此,如果没有定义任何内容,它就不会在命令之前添加内容。
  • @JeroenMostert 我写了批处理文件:hastebin.com/omeparoruc.bat,但它似乎不起作用。如果我双击它,CMD 会弹出一秒钟,说环境已初始化,然后消失,没有任何反应。此外,如果我在 CMD 会话中运行批处理文件,它与双击它的效果相同,甚至不会在 CMD 中打开 PS。

标签: windows visual-studio powershell batch-file environment-variables


【解决方案1】:

编写一个批处理文件,1) 调用 vcvarsall.bat,2) 调用 PowerShell,就像这样(这个是 VS 2015 特有的):

@CALL "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" %*
@start powershell

%* 允许我们将相同的参数传递给此文件,就像您传递给 vcvarsall.bat 一样。

然后,PowerShell 将使用为其准备的环境块运行。反过来也行不通,因为 PowerShell 本身不执行批处理文件——它依赖 cmd 来执行此操作,并且作为子进程,它有自己的环境块,不会反映在其父进程上。

【讨论】:

  • 对于VS2017 Build Tools,调用路径为C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\Tools\VsDevCmd.bat
【解决方案2】:
<#
.SYNOPSIS
    Invokes the specified batch file and retains any environment variable changes it makes.
.DESCRIPTION
    Invoke the specified batch file (and parameters), but also propagate any
    environment variable changes back to the PowerShell environment that
    called it.
.PARAMETER Path
    Path to a .bat or .cmd file.
.PARAMETER Parameters
    Parameters to pass to the batch file.
.EXAMPLE
    C:\PS> Invoke-BatchFile "$env:ProgramFiles\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"
    Invokes the vcvarsall.bat file.  All environment variable changes it makes will be
    propagated to the current PowerShell session.
.NOTES
    Author: Lee Holmes
#>
function Invoke-BatchFile
{
    param([string]$Path, [string]$Parameters)

    $tempFile = [IO.Path]::GetTempFileName()

    ## Store the output of cmd.exe.  We also ask cmd.exe to output
    ## the environment table after the batch file completes
    cmd.exe /c " `"$Path`" $Parameters && set " > $tempFile

    ## Go through the environment variables in the temp file.
    ## For each of them, set the variable in our local environment.
    Get-Content $tempFile | Foreach-Object {
        if ($_ -match "^(.*?)=(.*)$") {
            Set-Content "env:\$($matches[1])" $matches[2]
        }
        else {
            $_
        }
    }

    Remove-Item $tempFile
}

$VcVars = 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Auxiliary\Build\vcvarsall.bat'
Invoke-BatchFile $VcVars x64
cl hello_world.cpp

【讨论】:

    猜你喜欢
    • 2018-12-07
    • 2017-04-05
    • 2018-06-16
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    • 1970-01-01
    相关资源
    最近更新 更多