在Windows PowerShell中运行VS 2017 Build Tools

时间:2017-07-12 22:21:49

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

我不喜欢IDE,因此我安装了VS 2017 Build Tools,因此我可以通过命令行工作。

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

  

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

我不应该自己设置环境变量,这对我很好,唯一的问题是当我在PS中运行vcvarsall.bat时,没有环境变量发生变化。我是PS新手,因此我猜测.bat个文件无法改变会话环境变量。如果是这样,那么我就无法解决PS问题。作为旁注,CLLINK变量从不出现,我将在下面解释。

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

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

2 个答案:

答案 0 :(得分:4)

编写一个批处理文件,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来执行此操作,并且作为子进程,它具有自己的环境块,而不会反映在其上父节点。

答案 1 :(得分:1)

<#
.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